水题他又lei了。
题目链接:https://codeforces.com/contest/1176
A:
暴力。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int q; 21 ll n; 22 23 int main() { 24 cin >> q; 25 while (q--) { 26 cin >> n; int ans = 0, flag = 1; 27 while (n != 1) { 28 if (n % 5 == 0) { 29 n = n / 5 * 4, ans++; continue; 30 } else if (n % 3 == 0) { 31 n = n / 3 * 2, ans++; continue; 32 } else if (n % 2 == 0) { 33 n /= 2, ans++; continue; 34 } else { 35 flag = 0; 36 break; 37 } 38 } 39 if (flag) cout << ans << endl; else puts("-1"); 40 } 41 return 0; 42 }
B:
仔细点就可以了。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int t, n; 21 22 int main() { 23 scanf("%d", &t); 24 while (t--) { 25 int a = 0, b = 0, c = 0; 26 scanf("%d", &n); 27 while (n--) { 28 int x; scanf("%d", &x); 29 if (x % 3 == 0) a++; 30 else if (x % 3 == 1) b++; 31 else if (x % 3 == 2) c++; 32 } 33 int ans = a, tmp = min(b, c); 34 ans += tmp, b -= tmp, c -= tmp; 35 ans += b / 3, ans += c / 3; 36 printf("%d ", ans); 37 } 38 return 0; 39 }
C:
次数统计即可。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 5e5 + 10; 21 int n, a[7], ans = 0; 22 23 int main() { 24 scanf("%d", &n); 25 rep1(i, 1, 6) a[i] = 0; 26 rep1(i, 1, n) { 27 int x; scanf("%d", &x); 28 if (x == 4) a[1]++; 29 else if (x == 8) 30 if (a[1] > a[2])a[2]++; else ans++; 31 else if (x == 15) 32 if (a[2] > a[3]) a[3]++; else ans++; 33 else if (x == 16) 34 if (a[3] > a[4]) a[4]++; else ans++; 35 else if (x == 23) 36 if (a[4] > a[5]) a[5]++; else ans++; 37 else if (a[5] > a[6]) a[6]++; else ans++; 38 } 39 int minn = int_inf; 40 rep1(i, 1, 6) minn = min(minn, a[i]); 41 rep1(i, 1, 6) ans += a[i] - minn; 42 printf("%d ", ans); 43 return 0; 44 }
D:
按照题目的意思,数组b中的所有合数必然在原有的数组a中。剩下的质数也就很好处理了。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 2750131; 21 int vis[maxn + 5], p[maxn + 5], cnt[2 * maxn + 5], a[maxn + 5], b[2 * maxn + 5]; 22 int tot = 1; 23 24 void getPrime() { 25 memset(vis, 0, sizeof(vis)); 26 for (int i = 2; i <= maxn; i++) { 27 if (vis[i] == 0) 28 p[tot++] = i; 29 for (int j = 1; j <= maxn && i * p[j] <= maxn; j++) { 30 vis[i * p[j]] = 1; 31 if (i % p[j] == 0) 32 break; 33 } 34 } 35 } 36 37 bool cmp(int a, int b) { 38 return a > b; 39 } 40 41 int main() { 42 int n; 43 getPrime(); 44 scanf("%d", &n); 45 memset(cnt, 0, sizeof(cnt)); 46 for (int i = 0; i < 2 * n; i++) { 47 scanf("%d", &b[i]); 48 cnt[b[i]]++; // count times 49 } 50 int q = 0; 51 sort(b, b + 2 * n, cmp); 52 for (int i = 0; i < 2 * n; i++) { 53 if (cnt[b[i]] == 0)continue; 54 if (vis[b[i]]) // if b[i] is not a prime, it must be in array a 55 for (int j = 1; j < tot; j++) 56 if (b[i] % p[j] == 0) { 57 int t = b[i] / p[j]; // t is the greatest divisor 58 a[q++] = b[i]; 59 cnt[b[i]]--; 60 cnt[t]--; 61 break; 62 } 63 } 64 for (int i = 2; i <= maxn; i++) 65 while (cnt[i]) { 66 a[q++] = i; 67 cnt[i]--; 68 cnt[p[i]]--; 69 } 70 for (int i = 0; i < n; i++) printf("%d ", a[i]); 71 puts(""); 72 return 0; 73 }
E:
说白了就是一个DFS染色的事情。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(half,b) sort(half+1,half+1+b) 9 #define rep1(i,half,b) for(int i=half;i<=b;++i) 10 #define rep0(i,half,b) for(int i=half;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 2e5 + 10; 21 int n, m, vis[maxn]; 22 vector<int>adj[maxn], ans, ans1; 23 24 void dfs(int x, int depth) { 25 if (depth % 2 == 0) ans.pb(x); 26 else ans1.pb(x); 27 vis[x] = 1; 28 rep0(i, 0, adj[x].size()) { 29 int y = adj[x][i]; 30 if (!vis[y]) dfs(y, depth + 1); 31 } 32 } 33 34 int main() { 35 int t; scanf("%d", &t); 36 while (t--) { 37 ans.clear(); ans1.clear(); 38 scanf("%d%d", &n, &m); 39 int half = n / 2; 40 rep1(i, 1, n) { 41 vis[i] = 0; adj[i].clear(); 42 } 43 rep1(i, 1, m) { 44 int x, y; scanf("%d%d", &x, &y); 45 adj[x].pb(y); adj[y].pb(x); 46 } 47 dfs(1, 0); 48 if (ans.size() <= half) { 49 printf("%d ", (int)ans.size()); 50 for (auto i : ans) printf("%d ", i); 51 } else { 52 printf("%d ", (int)ans1.size()); 53 for (auto i : ans1) printf("%d ", i); 54 } 55 puts(""); 56 } 57 return 0; 58 }
F:
dp跑路……