AtCoder Beginner Contest 095 解题报告

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;
}

猜你喜欢

转载自blog.csdn.net/yczhaoxun/article/details/80041464
今日推荐