标签:它的 div convert 数据 ons names 数组 合并 one
题目大意:给你几个数,这些数里面只有0或1,你有两种操作:1.把一段区域内的所有数前后交换位置。2.把一段区域内所有数取反。(区域可大可小,可以是所有数也 可以只有一个数)。两个操作各有它的代价,你操作一次就要消耗一次代价,求把所有数都变成1所需要的最小代价。
输入:第一行输入n , ab, c :表示有n个数,操作1代价b,操作2代价c;
第二行输入n个数,就是你要操作的数组。
输出:一行,输出最小代价。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=3e5+10;//数据范围 int a[maxn];char s[maxn]; int n,b,c; long long cnt; int main(){ scanf("%d %d %d",&n,&b,&c); scanf("%s",s);//输入是连着的数字,用一个字符串存 int i=0; while(s[i]!=‘\0‘){ a[i+1]=s[i]-‘0‘; i++; }//把字符串转为整形数组 for(int i=1;i<=n;i++){ if(a[i]==0){ while(a[i]==0){ i++; }//跳出循环时候,一个“0组”被遍历完毕。 cnt++; } } //cnt表示有几个“0组” if(cnt==0){ printf("0\n"); return 0; }//如果这里不特判,(cnt-1)*b+c可能为负,结果就错了 printf("%lld\n",1ll*min(cnt*c,(cnt-1)*b+c));//cnt,b,c<3e6,cnt*c可能超过int范围
return 0; }
Convert to Ones CodeForces(超水题)
标签:它的 div convert 数据 ons names 数组 合并 one
原文地址:https://www.cnblogs.com/liu-yi-tong/p/12678652.html