Codeforces Round #409 (Div. 2)
這是一次血崩的cf,腦子不好使了。讀題讀錯...代碼寫錯...查不出錯...WAWAWA
這次題比較常規(guī)。前二題很簡單,第三題二分,第四題數(shù)學。
?
A - Vicious Keyboard【暴力模擬】
題意:
改變最多一個字符,讓字符串中出現(xiàn)最多的"VK"。
PS:
比賽時做法是先走一遍字符串找"VK“,標記已經(jīng)構(gòu)成"VK"的位置。再跑一遍字符串,
如果出現(xiàn)a[i]和a[i-1]都沒標記過,而且a[i-1]=='V' 或a[i]=='K'時,結(jié)果+1并跳出循環(huán)。
結(jié)果 || 寫成了&&,WA了,然后堅信C可做,就放棄檢查了...
做法:
字符串長最多是100,直接O(n2)暴力最保險最容易寫。
版本1:| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include?<bits/stdc++.h> #define?pii?pair<int,int> #define?MEM(a,b)?memset(a,?b,?sizeof(a)) #define?ll?long?long const?double?pi?=?acos(-1.0); using?namespace?std; int?main()?{ ????string?a; ????cin?>>?a; ????int?len?=?a.size(); ????bool?flag?=?true; ????bool?f[1000]; ????memset(f,?false,?sizeof(f)); ????int?ans?=?0; ????for(int?i?=?1;?i?<?a.size();?i++)?{ ????????if(a[i]?==?'K'?&&?a[i-1]?==?'V')?{ ????????????ans++; ????????????f[i]?=?f[i-1]?=?true; ????????} ????} ????for(int?i?=?1;?i?<?a.size();?i++)?{ ????????if(f[i]?==?true?||?f[i-1]?==?true)?continue; ????????if(a[i]?==?'K'?||?a[i-1]?==?'V')?{ ????????????ans++; ????????????break; ????????} ????} ????cout?<<?ans?<<?endl; } |
?版本2:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include?<bits/stdc++.h> #define?pii?pair<int,int> #define?MEM(a,b)?memset(a,?b,?sizeof(a)) #define?ll?long?long const?double?pi?=?acos(-1.0); using?namespace?std; int?solve(string?a)?{ ????int?ans?=?0; ????for(int?i?=?1;?i?<?a.size();?i++)?{ ????????if(a[i]?==?'K'?&&?a[i-1]?==?'V')?ans++; ????} ????return?ans; } int?main()?{ ????string?a; ????cin?>>?a; ????int?ans?=?solve(a); ????for(int?i?=?0;?i?<?a.size();?i++)?{ ????????if(a[i]?==?'V')?a[i]?=?'K';?else?a[i]?=?'V';??//改變一個字符 ????????ans?=?max(ans,?solve(a)); ????????if(a[i]?==?'V')?a[i]?=?'K';?else?a[i]?=?'V';??//改回來 ????} ????cout?<<?ans?<<?endl; } |
?
B - Valued Keys【模擬】
題意:
a, b, c三個字符串等長, c = f(a,b) 。
函數(shù)的意義是取a, b對應(yīng)字符的最小值 ( 即 c[i] = min ( a[i], b[i] )。
給你a和c,讓你構(gòu)造一個可行b,如果不存在輸出-1。
做法:
兩種情況:
1.存在則輸出c,因為f(a,c)一定等于c
2.若不存在,即存在任意一個c[i] > a[i],則輸出-1。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | #include?<bits/stdc++.h> using?namespace?std; int?main()?{ ????string?a,?b; ????cin?>>?a?>>?b; ????for(int?i?=?0;?i?<?a.size();?i++)?{ ????????if(b[i]?>?a[i])?{ ????????????puts("-1"); ????????????return?0; ????????} ????} ????cout?<<?b?<<?endl; } |
?
C - Voltage Keepsake【二分求最大化結(jié)果】
?題意:
給你N個設(shè)備和1個充電器。充電器每單位時間可以沖p份電量。接下來給你N個設(shè)備每單位時間的耗電量和初始電量。
所有設(shè)備都要保持有電,問你怎么充電使得設(shè)備維持時間最長,如果可以無限使用,輸出-1。
做法:
二分時間。根據(jù)judge算出每個設(shè)備維持mid時間的話,至少需要充多少電。
根據(jù)等式 y + t * p = mid * x 累加 t 值, 如果 t 值大于 mid 值說明充電時間不夠,返回false。
如果最終結(jié)果超過1e17,說明無限長。
也能通過計算來判斷是否無限長,累加所有設(shè)備的耗電量sum,如果 sum <= p,說明可以無限使用。
PS:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include?<bits/stdc++.h> #define?pii?pair<int,int> #define?MEM(a,b)?memset(a,?b,?sizeof(a)) #define?ll?long?long const?double?pi?=?acos(-1.0); const?double?eps?=?1e-9; using?namespace?std; struct?Node?{ ????double?x,?y; }node[100100]; int?n; double?p; bool?judge(double?mid)?{ ????double?ans?=?0; ????for(int?i?=?0;?i?<?n;?i++)?{ ????????if(mid?*?node[i].x?<?node[i].y)?continue;??//?y?>?mid?*?x?說明不用充電 ????????double?tp?=?(mid?*?node[i].x?-?node[i].y)?/?p;?//?y?+?t?*?p?=?mid?*?x??根據(jù)這個等式累加t ????????ans?+=?tp; ????????if(ans?>?mid)?return?false; ????} ????return?true; } int?main()?{ ????scanf("%d%lf",?&n,?&p); ????for(int?i?=?0;?i?<?n;?i++)?{ ????????scanf("%lf%lf",&node[i].x,?&node[i].y); ????} ????double?mid; ????double?low?=?0,?high?=?1e18;?//注意極值 ????for(int?i?=?0;?i?<?100;?i++)?{??//二分100次 ????????mid?=?(low?+?high)?/?2; ????????if(judge(mid))?low?=?mid; ????????else?high?=?mid; ????} ????if(mid?>?1e17)?puts("-1");??//注意不要1e18-2,浮點數(shù)丟精度 ????else?printf("%.10f\n",?mid); } |
轉(zhuǎn)載于:https://www.cnblogs.com/bestwzh/p/6724402.html
總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #409 (Div. 2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 已经换完电池了,为什么煤气表上还是显示&
- 下一篇: 北京现代百公里油耗显示反应迟钝怎么回事北