A,B,C都是水题,思路如下:
A:看有多少o,在700的基础上加上就是。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
int main(){
char s[4];
scanf("%s",&s);
int len = strlen(s);
int ans = 0;
for(int i = 0; i < len; i++){
if(s[i] == 'o')
ans++;
}
printf("%d\n",ans*100 + 700);
return 0;
}
B:先把基础的减去,再除最小那个即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,x;
int m[105];
int minn = 10005;
int cnt = 0;
int main(){
scanf("%d %d",&n, &x);
for(int i = 0; i < n; i++){
scanf("%d",&m[i]);
x -= m[i];
cnt++;
if(m[i] < minn){
minn = m[i];
}
}
printf("%d\n",cnt + x / minn);
return 0;
}
C:只有三种情况。
1.分开买
2.先用A-B混合型买,再把剩下的单独买
3.全部用A-B混合型买
求最小值即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int minn(int a, int b){
if(a < b)
return a;
return b;
}
int maxx(int a, int b){
if(a > b)
return a;
return b;
}
int main(){
int a, b, c, x, y;
long long ans = 0;
scanf("%d %d %d %d %d",&a, &b, &c, &x, &y);
int maxy = maxx(x, y);
int miny = minn(x, y);
int chaxy = maxy - miny;
if(2 * c < a + b){
ans += miny * 2 * c;
if(miny == x)
ans += chaxy * b;
else
ans += chaxy * a;
}
else{
ans = x * a + y * b;
}
long long sum = 2 * c * maxy;
if(sum < ans)
printf("%lld\n",sum);
else
printf("%lld\n",ans);
return 0;
}
D:有四种情况:
1.正着走 2.逆着走 3.在正着走中途倒回去 4.在逆着走中途倒回去。
用dp[0][i]表示正着走到第i个点所得的最大能量,dp[1][i] 表示逆着走到第i个点的最大能量。m[0][i] 表示正着在第i个点倒回去的能量,m[1][i] 反之。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1e5 + 5;
const long long inf = 1e14 + 5;
int n,v[maxn];
long long c, ans,x[maxn];
long long dp[2][maxn], m[2][maxn];
int main(){
scanf("%d %lld",&n, &c);
for(int i = 0; i < n; i++){
scanf("%lld %d",&x[i],&v[i]);
}
for(int i = 0; i < n; i++) dp[0][i] = dp[1][i] = -inf;//初始化
long long sum = 0;
for(int i = 0; i < n; i++){
sum += v[i];
dp[0][i] = max(dp[0][i - 1], sum - x[i]);//走或不走这个点
m[0][i] = sum - 2 * x[i];//走回去自然是两倍
}
sum = 0;//置为0
for(int i = n - 1; i >= 0; i--){//反着来
sum += v[i];
dp[1][i] = max(dp[1][i + 1], sum - (c - x[i]));
m[1][i] = sum - 2 * (c - x[i]);
}
ans = max(dp[0][n-1], dp[1][0]);//正着走到n-1和反着走到0的最大值
for(int i = 0; i < n; i++){
ans = max(ans, m[0][i] + dp[1][i + 1]);//反着走中途倒回去
ans = max(ans, m[1][n - i] + dp[0][n - i - 1]);//正着走中途倒回去
}
if(ans != 0)
printf("%lld\n",ans);
else
printf("0\n");
return 0;
}