日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zoj2196

發(fā)布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zoj2196 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

給一個長度為n(n <= 10^5)的“01”串,你可以任意交換一個為0的位和一個為1的位,若這兩位相鄰,花費為X,否則花費為Y。求通過若干次交換后將串中的“1”全部變換到“0”前面的最小花費。
Input
第一行一個整數(shù)T(1 <= T <= 10),表示測試數(shù)據(jù)的組數(shù)。接下來3*T行,每組數(shù)據(jù)三行,第一行為整數(shù)X(1 <= X <= 10^3),第二行為整數(shù)Y(X <= Y <= 10^3),第三行是“01”串。
Output
最小花費。
Sample Input
2
1
2
1100
1
2
0011
Sample Output
0
3

思路:如果我們按照一步一步挪動的走法來做的話,無論怎么挪動,無論你先挪哪個后挪哪個,挪動的步數(shù)都是一樣的。但是這里我們有兩種挪動的方法,一種是跳著挪動,一種是相鄰的挪動,無非二選一,而且無非一種比另一種合適(當(dāng)然也可能相同消耗)。那么我們貪心的點就應(yīng)該鎖定在挪動步數(shù)上邊,從樣例2我們就能看出來:
0011
我們盡量用第一個0和最后一個1交換,我們這樣就能保證靠近中間的0和1相近,也就是更近。
AC代碼:

#include<bits/stdc++.h> using namespace std;#define e exp(1) #define pi acos(-1) #define mod 1000000007 #define inf 0x3f3f3f3f #define ll long long #define ull unsigned long long #define mem(a,b) memset(a,b,sizeof(a)) int gcd(int a,int b){return b?gcd(b,a%b):a;}int const maxn = 1e5+5; char s[maxn]; int idx[maxn];int main() {int T;scanf("%d", &T);while(T--){int x, y;scanf("%d %d",&x, &y);scanf("%s",s);int len = strlen(s), cnt = 0;for(int i = len - 1; i >= 0; i--)if(s[i] == '1')idx[cnt ++] = i;int ans = 0, now = 0;for(int i = 0; i < cnt; i++)if(s[i] == '0')ans += min(y, x * (idx[now ++] - i));printf("%d\n", ans);} }

總結(jié)

以上是生活随笔為你收集整理的zoj2196的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。