2019年1月“最強程式碼”冬季賽
這是一個簽到題
Description
眾所周知,中國礦業大學將在2019年6月1日迎來建校110週年。但是Alice想知道在哪一年中國礦業大學會迎來n週年紀念。
Input
一行,一個整數n(1<=n<=200),代表中國礦業大學n週年。
Output
在一行中輸出一個正整數x,表示在x年,中國礦業大學會迎來n週年紀念。
Sample Input 1
110
Sample Output 1
2019
AC code:
#include<iostream> using namespace std; int main() { int n; cin >> n; cout << n + 1909 << endl; return 0; }
壯壯與月亮女神
Description
能與壯壯哥平分秋色的放眼學校僅有月亮女神一人。這天你奉壯壯哥之名勸說月亮女神歸順壯壯哥。但是作為全校第二能打的,豈是那麼輕易就能見面的?月亮女神宿舍門上有一個n階方陣,如果你能按照s型依次將1~n^2填入方陣,你就能見到月亮女神。
Input
一行,一個整數n代表矩陣的階數(0 < n < 500)
Output
n行,每行n個整數,用空格分隔,代表第i行矩陣元素。
Sample Input 1
3
Sample Output 1
1 2 3 6 5 4 7 8 9
AC code:
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<vector<int>> temp(n, vector<int>(n, 0)); int flag = 1; int curNum = 1; for (int i = 0; i < n; ++i) { if (flag == 1) { for (int j = 0; j < n; ++j) { temp[i][j] = curNum++; } flag = 0; } else { for (int j = n-1; j >= 0; --j) { temp[i][j] = curNum++; } flag = 1; } } for (int i = 0; i < n; ++i) { cout << temp[i][0]; for (int j = 1; j < n; ++j) { cout << " " << temp[i][j]; } cout << endl; } return 0; }
月亮女神的魔法
Description
月亮女神是田徑好手,有一天她在參加扔鐵餅比賽時,慘遭壯壯哥的羞辱,0:5慘敗!於是次日她想用魔法來找回面子。月亮女神會如下兩個魔法:1.月亮女神的加速:使鐵餅飛a米。2.月亮女神全身變:使a變為a+5。現給出初始的a與月亮女神可以使用魔法的次數t,求她最遠能將鐵餅扔多遠。
Input
一行,兩個整數,a和t,其含義如題意所述。(0<=a,t<=1000)
Output
一行,一個整數,即鐵餅最遠能飛多少米。
Sample Input 1
20 20
Sample Output 1
720
my code:
#include <iostream> #include <vector> using namespace std; int dfs(int m, int n, int temp); vector<vector<int>> memo(10000, vector<int>(1005, 0)); int main() { int m, n; cin >> m >> n; cout << dfs(m, n, 0) << endl; return 0; } int dfs(int m, int n, int temp) { if (n <= 0) return temp; if (memo[m][n] != 0) return memo[m][n]; memo[m][n] = temp; return max(dfs(m, n-1, temp+m), dfs(m+5, n-1, temp)); }
Analysis:
剛開始想到的就是用dfs來深搜,但是當資料達到100是就已經計算不出來結果了(TLE),於是我又加了一個memo用來儲存已經處理過的狀態,雖然速度提高了很多,但是最後提交的時候還是沒能通過。
壯壯的心理學
Description
別看壯壯又高又壯,但她其實是個心思細膩的女孩,也是個心理學高手!每天壯壯哥都要檢閱她的小弟,而小弟總會拍一句馬屁,壯壯想知道誰說的是真的,誰說的是假的。已知共n個人,依次從1~n編號,每個人說一句話,如果該話長度為奇數,即為假話,偶數為真話。
Input
第一行一個整數n(0<n<100000),為小弟個數。接下來n行,每行一個字串,為小弟說的話。
Output
一個整數a,a為說真話的人的總數。
Sample Input 1
3 Zhuangzhuanggehaoshuai Aaaa lihai
AC code:
#include <iostream> using namespace std; int main() { int n; cin >> n; int ans = 0; for (int i = 0; i < n; ++i) { string str; cin >> str; if (str.length() % 2 == 0) ans++; } cout << ans << endl; return 0; }
統計某類完全平方數
Description
統計給定區間(100~n)內的三位數中有兩位數字相同的完全平方數(如144、676)的個數。
Input
一個整數n,(1000>n>=100)
Output
一個整數n。
Sample Input 1
500
Sample Output 1
6
My code:
#include <iostream> using namespace std; int main() { int n; cin >> n; int ans = 0; for (int i = 11; i < 32 && i*i <= n; ++i) { int cur = i * i; int g = cur % 10; int s = (cur / 10) % 10; int b = (cur / 100) % 10; cout << b << s << g << endl; if (g == s || g == b || s == b) ans++; } cout << ans << endl; return 0; }
Analysis: 感覺是很簡單的一道題,但是不知道為什麼提交的時候總是出錯。
會魔法的Alice
Description
Alice和Bob在一起玩一個遊戲,遊戲通關的條件是使這個數列的和為0,但有時候數列的和並不是0,但是Alice會魔法,她可以把一個數變成自己的相反數,並且Alice只有一次使用魔法的機會。請問你Alice和Bob能不能通關呢?當然,如果數列剛開始的和就是0,也可以通關。
Input
第一行包含一個正整數n(1<=n<=1e5),表示數列的個數第二行有n個數Xi(1<=i<=n, -100<=x<=100),表示這個數列。
Output
如果Alice和Bob可以通關,輸出“YES”,否則輸出“NO”。(輸出不包括雙引號)
Sample Input 1
5 1 3 -5 3 4
Sample Output 1
YES
Hint
可以把其中一個3變為-3,最後數列和為0。符合通關條件。
AC code:
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> temp; int sum = 0; for (int i = 0; i < n; ++i) { int num; cin >> num; temp.push_back(num); sum += num; } if (sum == 0) { cout << "YES" << endl; return 0; } for (int i = 0; i < n; ++i) { if (temp[i] == sum/2) { cout << "YES" << endl; return 0; } } cout << "NO" << endl; return 0; }
2^k的和
Description
如果一個正整數n滿足其值為2^k(其中k為正整數),例如32,16。我們稱這種數為2^k整數。但這種數畢竟很少,現在定義2^k半整數,雖然n不滿足2^k整數,但n可以由兩個2^k整數相加得到,這樣的n我們稱為2^k半整數(其中k為正整數)。當然2^k整數也滿足2^k半整數。例如32可以由16和16相加而成,48可以由32和16相加而成。
Input
第一行一個整數t(1<=t<=20),表示t組資料。接下來有t行,每行一個整數n。(1<=n<=1e6)
Output
如果n是2^k半整數,輸出Yes,否則輸出No。
Sample Input 1
3 48 49 32
Sample Output 1
Yes No Yes
My code:
#include <iostream> #include <vector> #include <set> using namespace std; vector<int> temp; set<int> memo; void init(int x) { for (int i = 0; i < x; ++i) { temp.push_back(2<<i); memo.insert(2<<i); } for (int i = 0; i < temp.size(); ++i) { for (int j = 0; j < temp.size(); ++j) { memo.insert(temp[i]+temp[j]); } } } int main() { int n; cin >> n; init(20); for (int i = 0; i < n; ++i) { int num; cin >> num; if (memo.count(num)) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
Analysis:
我把所有的可能都遍歷出來,然後儲存在set中,然後在查詢,不知道為什麼最後還是會出錯。可能是不應該把兩個相同的數相加吧。
戰士、魔法師、射手
Description
這一天Bob接觸了角色扮演遊戲,其中包含戰士(warrior)、魔法師(enchanter)、射手(shooter)三個職業,Bob建立了n個賬號,每個賬號的編號是1~n,且沒有任何兩個賬號的編號相同。每個賬號的職業可能是戰士、魔法師、射手中的一種。這時候Bob定義了一種排序,職業排序。規則是這樣的:首先規定三個職業的先後順序,職業1,職業2,職業3,意味著這樣的順序:職業1的所有單位在職業2的所有單位和職業3的所有單位的前面,職業2的所有單位在職業3的所有單位之前。但是要注意:職業間的相對順序不發生改變。假如給出的排序規則是,warrior,enchanter,shooter,那麼所有的warrior排在最前面,緊接著是enchanter,最後shooter。如果其中沒有一個相對的職業,則跳過該種族
Input
第一行包含一個正整數n(1<=n<=100),代表Bob建立了n個賬號。接下來n行,每行的輸入一個字串,格式為:“ID is 職業”,中間以一個空格隔開。其中ID為1~n的正整數,且每個ID唯一。職業是一個字串,保證是warrior,enchanter,shooter 三種職業中的一種。最後一行包含三個字串:職業1 職業2 職業3。中間用一個空格隔開,代表職業排序的先後順序。
Output
對於每組資料,按照 職業1 職業2 職業3的排序規則,在一行輸出排序後的ID序列,兩個ID之間用一個空格隔開。
Sample Input 1
5 1 is warrior 2 is enchanter 3 is shooter 4 is warrior 5 is warrior warrior enchanter shooter
Sample Output 1
1 4 5 2 3
Sample Input 2
4 1 is warrior 4 is warrior 3 is warrior 2 is shooter shooter enchanter warrior
My code:
#include <iostream> #include <map> #include <vector> #include <string> using namespace std; map<string, vector<int>> m; int main() { int n; cin >> n; getchar(); for (int i = 0; i < n; ++i) { string str; getline(cin, str); int pos1 = str.find(' '); string num = str.substr(0, pos1); int pos2 = str.find(' ', pos1+1); string name = str.substr(pos2+1); m[name].push_back(stoi(num)); } vector<int> ans; string str; getline(cin, str); int pos1 = str.find(' '); string name1 = str.substr(0, pos1); if (m.count(name1)) for (int i = 0; i < m[name1].size(); ++i) ans.push_back(m[name1][i]); int pos2 = str.find(' ', pos1+1); string name2 = str.substr(pos1+1, pos2-pos1-1); if (m.count(name2)) for (int i = 0; i < m[name2].size(); ++i) ans.push_back(m[name2][i]); string name3 = str.substr(pos2+1); if (m.count(name3)) for (int i = 0; i < m[name3].size(); ++i) ans.push_back(m[name3][i]); if (!ans.empty()) { cout << ans[0]; for (int i = 1; i < ans.size(); ++i) { cout << ' ' << ans[i]; } cout << endl; } return 0; }
Analysis:
用STL中的string操作了一波,樣例過了,但是最後還是沒有AC。
兩小兒又來取石子
Description
Alice和Bob這天又約出來一起玩遊戲,但這次取石子的方式稍有不同。有n個石子擺成一排,編號為1~n,Alice和Bob每次可以取1~k個連續編號的石子,假設他們都很聰明,都選取最優的選法,Alice先手,如果誰不能取石子了,則為輸。
注意:石子按照一排排列,例如n=3,k=2, 3個石子編號為1 2 3,每次可以取1~2個石子,Alice先把2號石子取走,這時候Bob不能拿走1 3,因為1和3號石子的編號不連續,Bob只能拿走1號或者2號石子,最後Alice拿走最後一個。Bob輸。
Input
兩個整數n和k。其中 0<=n<=100, 1<=k<=100。
Output
若Alice不能取石子,輸出“Bob”,否則輸出“Alice”。
Sample Input 1
3 2
Sample Output 1
Alice
Sample Input 2
2 1
Sample Output 2
Bob
Code:
waiting...........
校霸爭奪會
Description
新生入校,壯壯雙手抱胸,目光凌厲的審視著每一個新生,尋找可能的對手。校霸的評定分為琴棋書畫四個方面,雖然壯壯一樣不通,但是她能打,凡是報名校霸選舉的,都會被壯壯打到休學。不懂規矩的你一入學就報了名,現在你的內心忐忑不安,決定向壯壯哥示好。向壯壯示好最佳方式就是記住她的生日,壯壯哥會告訴你今天的日期以及她出生多少天了,請你算出她的生日。注意,如果不能在一秒鐘答出,你會捱揍。
Input
第一行是今天的日期,按yyyy mm dd形式給出。保證輸入日期合法。第二行一個整數t,表示壯壯出生了t天。(題目保證日期符合規範,0 <= t <= 100000,其中日期規則按照萬年曆,即國際通用日曆計算)
Output
一行,yyyy-mm-dd形式,代表壯壯出生日期。
Sample Input 1
2019 01 10 10
Sample Output 1
2019-01-01
Code:
wait...........