Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题
題意:
給你一個長度為 nnn 的 010101串 ,你有兩種操作:
1.將一個子串翻轉,花費 XXX
2.將一個子串中的0變成1,1變成0,花費 YYY
求你將這個01串變成全是1的串的最少花費。
首先,我們可以將串按照0,10,10,1這劃分,例如:
?00011001110??>?000?+?11?+?00?+?111?+?0??00011001110? -> ?000? + ?11? + ?00? + ?111? + ?0??00011001110??>?000?+?11?+?00?+?111?+?0?,可以看出只有相鄰的010101串間進行操作才是有意義的。
將左面的 000 串與右面的 111 進行 “交換” 有兩種辦法:
1.將000 同一修改為 111.
2.將該串與靠右的一個111串交換(即翻轉).
由于題中X,YX,YX,Y 是一個確定的值,這就使得我們每次的交換方法一定是相同的。然而,如果一直用第 222 種方法進行變換,最終必定還要使用一次 111 操作來將已經連城的一排 000, 統一修改為 111。即最小花費為:(p?1)?min(x,y)+y(p-1)*min(x,y)+y(p?1)?min(x,y)+y,ppp 為原序列中 000 串的數量。
Code:
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int maxn = 300000 + 4; int nex[maxn]; char str[maxn]; int main() {int n, x, y, cnt = 0;scanf("%d%d%d",&n,&x,&y);scanf("%s",str + 1);str[0] = str[1] == '1' ? '0' : '1'; for(int i = 1;i <= n; ++i) if(str[i] == '0' && str[i] != str[i - 1]) ++cnt;if(cnt == 0) printf("0");else cout << (long long)(cnt - 1) * min(x, y) + y;return 0; }轉載于:https://www.cnblogs.com/guangheli/p/9845121.html
總結
以上是生活随笔為你收集整理的Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开局一台拖拉机 轿跑皮卡自己刷:富士康造
- 下一篇: 中国显卡厂商芯动科技加入UCIe联盟:首