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