Educational Codeforces Round 25
這一場是暑期的第一場,做了4個題,被HACK兩個,都是很粗心的錯誤,手生的問題。
【A】Binary Protocol
題意:給你一串字符串,只有0和1。用m個0將字符串分為m+1段,每段字符串中‘1’的個數(shù)代表一個數(shù)。
做法:在末尾補0.然后掃一遍。遇到1累加,遇到0輸出累加值。
注意:
1001有兩個連續(xù)的0,兩個0之間有0個1,所以輸出0,結(jié)果101.
1110末尾為0,0的后面有0個1,所以也要輸出0,結(jié)果30.
代碼:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include?<bits/stdc++.h> using?namespace?std; int?main()?{ ????string?s; ????int?len; ????while(cin?>>?len?>>?s)?{ ????????s?=?s?+?'0'; ????????int?tp?=?0; ????????for(int?i?=?0;?i?<?len+1;?i++)?{ ????????????if(s[i]?==?'1')?tp++; ????????????else?{ ????????????????cout?<<?tp; ????????????????tp?=?0; ????????????} ????????} ????????cout?<<?endl; ????} } |
?
【B】Five-In-a-Row
題意: 五子棋,下一步是X,問能否勝利。
做法:完全暴力,枚舉X的位置,然后check一下能否構(gòu)成5個子。
PS:傻逼的忘了判斷正斜線,被HACK了,五子棋白下了。
| 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include?<bits/stdc++.h> using?namespace?std; char?mp[20][20]; bool?check(int?x,?int?y){ ????? ????//列 ????int?tp?=?1; ????for(int?i?=?x?+?1;?i?<?10;?i++)?{ ????????if(mp[i][y]?==?'X')?tp++; ????????else?break; ????} ????for(int?i?=?x?-?1;?i?>=?0;?i--)?{ ????????if(mp[i][y]?==?'X')?tp++; ????????else?break; ????} ????if(tp?>=?5)?return?true; ????? ????//行 ????tp?=?1; ????for(int?j?=?y?+?1;?j?<?10;?j++)?{ ????????if(mp[x][j]?==?'X')?tp++; ????????else?break; ????} ????for(int?j?=?y?-?1;?j?>=?0;?j--)?{ ????????if(mp[x][j]?==?'X')?tp++; ????????else?break; ????} ????if(tp?>=?5)?return?true; ????? ????//負斜線 ????int?a?=?x,?b?=?y; ????tp?=?1; ????while(x?>=0?&&?y?>=?0)?{ ????????x--;?y--; ????????if(x?>=0?&&?y?>=?0?&&?mp[x][y]?==?'X')?tp++; ????????else?break; ????} ????x?=?a,?y?=?b; ????while(x?<?10?&&?y?<?10)?{ ????????x++;?y++; ????????if(x?<?10?&&?y?<?10?&&?mp[x][y]?==?'X')?tp++; ????????else?break; ????} ????if(tp?>=?5)?return?true; ????? ????//正斜線 ????x?=?a,?y?=?b; ????tp?=?1; ????while(x?>=?0?&&?y?>=?0?&&?x?<?10?&&?y?<?10)?{ ????????x--; ????????y++; ????????if(x?>=?0?&&?y?>=?0?&&?x?<?10?&&?y?<?10?&&?mp[x][y]?==?'X')?tp++; ????????else?break; ????} ????x?=?a,?y?=?b; ????while(x?>=?0?&&?y?>=?0?&&?x?<?10?&&?y?<?10)?{ ????????x++; ????????y--; ????????if(x?>=?0?&&?y?>=?0?&&?x?<?10?&&?y?<?10?&&?mp[x][y]?==?'X')?tp++; ????????else?break; ????} ????if(tp?>=?5)?return?true; ????return?false; } int?main()?{ ????for(int?i?=?0;?i?<?10;?i++)?{ ????????scanf("%s",?&mp[i]); ????} //????枚舉X的位置 ????for(int?i?=?0;?i?<?10;?i++)?{ ????????for(int?j?=?0;?j?<?10;?j++)?{ ????????????if(mp[i][j]?==?'.')?{ ????????????????mp[i][j]?=?'X'; ????????????????if(?check(i,?j)?)?{ ????????????????????puts("YES"); ????????????????????return?0; ????????????????} ????????????????mp[i][j]?=?'.'; ????????????} ????????} ????} ????puts("NO"); } |
【C】Multi-judge Solving
題意:做題。每個題有難度等級。給定Makes目前做過最難題的等級D,只要題的難度A <= 2D,那么Makes就可以做。不然Makes就要從別的OJ做任意可做難度的題。問至少需要在別的OJ做多少題。
做法:貪心。按題目難度從小到大排序。如果當前題可以做,那么就更新D;不能做就去別的OJ做一道能做的最難的題,也就是2D的難度,更新D = 2D。
代碼:
| 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 | #include?<bits/stdc++.h> #define?LL?long?long using?namespace?std; int?main()?{ ????int?n; ????LL?k; ????LL?a[1010]; ????scanf("%d%I64d",?&n,?&k); ????for(int?i?=?0;?i?<?n;?i++)?scanf("%I64d",?&a[i]); ????sort(a,?a?+?n); ????LL?ans?=?0; ????for(int?i?=?0;?i?<?n;?i++)?{ ????????LL?tp?=?a[i]?+?1?>>?1; ????????if(k?>=?tp)?{ ????????????k?=?max(k,?a[i]); ????????}?else?{ ????????????while(k?<?tp)?{ ????????????????k?=?2?*?k; ????????????????ans?++; ????????????} ????????????k?=?max(k,?a[i]); ????????} ????} ????cout?<<?ans?<<?endl; } |
【D】?Suitable Replacement
題意:給定2個字符串。A字符串的?可以是任意小寫字母。讓你補齊?,任意調(diào)整順序,使得A字符串包含最多個B字符串 。
做法:模擬構(gòu)造。先計算第B字符串對每個字母的消耗量,例如aabbc,則consum['a'] = 2, consum['b'] = 2, consum['c'] = 1。
累計A字符串各個字符的個數(shù)。計算A字符串可以減去多少 “波“B字符串 ,不夠用‘?‘來代替,直至’?‘不夠用。輸出構(gòu)造結(jié)果,剩余的’?‘隨便用一個字母補齊。
代碼:
| 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include?<bits/stdc++.h> using?namespace?std; int?node[200];?//A字符串中各個字符的個數(shù) int?main()?{ ????string?s,?t; ????memset(node,?0,?sizeof(node)); ????cin?>>?s?>>?t; ????//判斷是否存在? ????bool?f?=?true; ????for(int?i?=?0;?i?<?s.size();?i++)?{ ????????if(s[i]?==?'?')?f?=?false; ????} ????if(f)?{ ????????cout?<<?s?<<?endl; ????????return?0; ????} ????? ????map<char,?int>mp;?//B字符串各個字符的個數(shù) ????vector<char>vec;?//存B字符串的N個字符 ????for(int?i?=?0;?i?<?t.size();?i++)?{ ????????mp[t[i]]++; ????????if(mp[t[i]]?==?1)?vec.push_back(t[i]); ????} ????int?len?=?0;?//問號個數(shù) ????for(int?i?=?0;?i?<?s.size();?i++)?{ ????????if(s[i]?==?'?')?len++; ????????else?if(mp[s[i]])?{ ????????????node[s[i]]++; ????????} ????} ????vector<char>ans; ????while(len?>?0)?{ ????????for(int?i?=?0;?i?<?vec.size();?i++)?{ ????????????node[vec[i]]?-=?mp[vec[i]]; ????????????if(node[vec[i]]?<?0)?{ ????????????????len?+=?node[vec[i]]; ????????????????if(len?<?0)?break; ????????????????int?n?=?-node[vec[i]]; ????????????????while(n--)?ans.push_back(vec[i]); ????????????????node[vec[i]]?=?0; ????????????} ????????} ????} ????int?idx?=?0; ????for(int?i?=?0;?i?<?s.size();?i++)?{ ????????if(s[i]?==?'?')?{ ????????????if(idx?<?ans.size())?{ ????????????????s[i]?=?ans[idx]; ????????????????idx++; ????????????}?else?{ ????????????????s[i]?=?'a'; ????????????} ????????} ????} ????cout?<<?s?<<?endl; } |
【E】Minimal Labels
題意:給定你一個不一定聯(lián)通的無環(huán)有向圖,讓你構(gòu)造一個序列ans[]。定義:u -> v, 那么 ans[u] < ans[v]。并且要求構(gòu)造出來的序列的字典序最小。
做法:因為無環(huán),所以一定存在出度為0的點,且出度為0的點構(gòu)造的值一定是最大的,不難看出,如果是連通圖,那么結(jié)果是一定的。如果是非連通圖,那就存在優(yōu)先問題,為了讓字典序最小,我們肯定是先給點小的點賦大值。
因此,用set來存出度為0的點,每次彈出一個最小的點,賦最大值,刪除指向它的邊,同時更新出度為0的點。
代碼:
| 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 | #include?<bits/stdc++.h> using?namespace?std; vector<int>in[100010]; vector<int>out[100010]; int?main?()?{ ????int?n,?m,?v,?u; ????scanf("%d%d",?&n,?&m); ????set<int,?greater<int>?>st;?//從小到大彈出 ????for(int?i?=?1;?i?<=?n;?i++)?st.insert(i); ????for(int?i?=?0;?i?<?m;?i++)?{ ????????scanf("%d%d",?&v,?&u); ????????in[u].push_back(v); ????????out[v].push_back(u); ????????st.erase(v); ????} ????int?ans[100010]; ????int?idx?=?n; ????while(!st.empty())?{ ????????int?cur?=?*st.begin(); ????????st.erase(st.begin()); ????????ans[cur]?=?idx--;?//賦最大值 ????????//刪除指向它的邊,同時更新出度為0的點 ????????for(int?i?=?0;?i?<?in[cur].size();?i++)?{ ????????????int?x?=?in[cur][i]; ????????????out[x].erase(find(out[x].begin(),?out[x].end(),?cur)); ????????????if(out[x].empty())?st.insert(x); ????????} ????} ????bool?f?=?false; ????for(int?i?=?1;?i?<=?n;?i++)?{ ????????if(f)?putchar('?');?f?=?true; ????????printf("%d",?ans[i]); ????} ????puts(""); } |
轉(zhuǎn)載于:https://www.cnblogs.com/bestwzh/p/7223843.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Educational Codeforces Round 25的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [LeetCode] Longest S
- 下一篇: 过滤器解决Struts2重定向漏洞