AtCoder Beginner Contest 118題解報告
A
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << (b % a ? b - a : b + a) << endl; return 0; }
B
#include <bits/stdc++.h> using namespace std; int main() { int N, M; cin >> N >> M; vector<int> cnt(M); for (int i = 0; i < N; i++) { int K; cin >> K; for (int j = 0; j < K; j++) { int A; cin >> A; A--; cnt[A]++; } } int ans = 0; for (int i = 0; i < M; i++) { if (cnt[i] == N) { ans += 1; } } cout << ans << endl; }
C
分析:
逐個求最大公約數就行。
程式碼:
#include<bits/stdc++.h> using namespace std; int gcd(int a,int b) { return (0 == b) ? a : gcd(b, a % b); } int main() { int N; cin >> N; int A[N]; for(int i=0;i<N;i++) { cin>>A[i]; } int ans = A[0]; for(int i=1;i<N;i++) { ans = gcd(ans,A[i]); } cout << ans << endl; return 0; }
D
分析:
本題可以使用動態規劃來解決。以樣例1為例 來分析。
20 4
3 7 8 4
(1)可先對Ai按從大到小的順序進行排序: 8 7 4 3
(2)資料的對應關係為
0 0 1 2 2 5 3 5 4 4 5 5 6 6 7 3 8 7 9 6
所以,樣例1中資料的對應關係為
8 7 7 3 4 4 3 5
所以,對映前的陣列A[] = {8, 7, 4, 3},對映後的陣列map[] = {7, 3, 4, 5}
(3)考慮到string過載了“+”運算子,可以很方便地將數字(字元)連線起來。
比如”7”+”7”=”77”, 或”77777” + “3” = “777773”。
可以宣告vector<string> dp,剛開始時,dp[i]都為””。dp中存放的是結果。
樣例1中N=20,則最終要求的是dp[20]。
(4)
根據樣例1中資料的對應關係,dp[7]=”8”, dp[3]=”7”, dp[4] = “4”, dp[5] = “3”。
接著從1開始列舉dp。
N = 1時,dp[1] = “”, 也就是說,{8,7,4,3}無法組成各位數之和為1的數。
N = 2時,dp[1] = “”, 也就是說,{8,7,4,3}無法組成各位數之和為2的數。
N = 3時,dp[3] = “7”。
N = 4時,dp[4] = “4”。
N = 5時,dp[5] = “3”。
N = 6時,6 = 3 + 3。3對應的數是7,所以dp[6] = “7” + “7” = “77”。
N = 7時,dp[7] = “7”。另外7 = 3 + 4 = 4 + 3,3對應的是7,4對應的是4。所以dp[7] = “74”或dp[7] = “47”。取最大值dp[7] = “74”。
N = 8時,dp[8] = 3 + 5 = 4 + 4 = 5 + 3。3對應著7,4對應著4,5對應著3,則dp[8] = “73”或“44”或“37”,取最大值dp[8] = “73”。
N = 9時,dp[9] = dp[6] + 3 = “777”。
……
最終,dp[20]即為所求。
程式碼:
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> m = {0, 2, 5, 5, 4, 5, 6, 3, 7, 6}; string getMax(string a, string b) { if(a.length() > b.length()) { return a; } else if(a.length() < b.length()) { return b; } else//如果長度相等,返回字典序較大的字串 { return a > b ? a : b; } } int main() { int N, M; cin >> N >> M; vector<int> A(M, 0); for(int i = 0; i < M; i++) { cin >> A[i]; } sort(A.begin(), A.end(), greater<int>()); vector<string> dp(max(N+1,10), ""); for(int i = 0; i < M; i++) { dp[m[A[i]]] = getMax(dp[m[A[i]]], to_string(A[i])); } for(int j = 0; j <= N; j++) { for(int i = 0; i < M; i++) { if(j - m[A[i]] >= 0 && dp[j-m[A[i]]] != "") { dp[j] = getMax(dp[j], dp[j-m[A[i]]] + to_string(A[i])); } } } cout << dp[N] << endl; return 0; }
TopCoder & Codeforces & AtCoder交流QQ群:648202993