Codeforces #493 div.2(A, B, C)

A.模拟

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int main(){
    int n, sum = 0;;    
    int a[15], pos[1005];
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
        pos[a[i]] = i;
        sum += a[i];
    }
    sort(a+1, a+n+1);
    if(a[1] == sum - a[1] || n == 1){
        printf("-1\n");
    }
    else{
        printf("1\n%d\n", pos[a[1]]);
    }
return 0;
}

B.贪心
如果要在一个位置砍断,那么这个位置前面的奇数和偶数个数相等,预处理所有这样的位置,按代价|x - y|排序,贪心的砍即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n, B;
int a[105], b[105];
int s[105];
int co[105];

int main(){
    scanf("%d%d", &n, &B);
    memset(co, -1, sizeof(co)); 
    for(int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
        if(a[i] % 2)
            b[i] = 1;
        else{
            b[i] = -1;
        }
    }
    for(int i = 1; i <= n; i++){
        s[i] = s[i-1] + b[i];
    }
    int m = 0;
    for(int i = 1; i <= n; i++){
        if(s[i] == 0 && i != n){
            co[++m] = abs(a[i]-a[i+1]);
        }
    }
    sort(co+1, co+m+1);
    int j = 1, cnt = 0;
    while(B){
        if(B >= co[j] && co[j] >= 0){
            B -= co[j];
            cnt++;
            j++;
        }
        else
            break;
    }
    printf("%d\n", cnt);
return 0;
}

C.
这个01串可以看出由0的块和1的块组成,可以看到要把所有0变成1,用翻转和替换都是可以的。所以设0块的数目为cnt,答案就是(cnt-1)* min(x, y) + y

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

long long n, x, y;
long long cnt;
char s[300005];

int main(){
    scanf("%I64d %I64d %I64d\n", &n, &x, &y);
    scanf("%s", s);
    for(int i = 0; i < n; i++){
        if(s[i] == '0'){
            while(s[i] != '1' && i < n){
                i++;
            }
            cnt++;
        }
    }
    if(cnt == 0){
        printf("0\n");
    }
    else{
        printf("%I64d\n", (cnt-1)*min(x, y) + y);
    }
return 0;
}

猜你喜欢

转载自blog.csdn.net/yczhaoxun/article/details/81625916