A :题意比较字符串中A和D的个数,输出获胜者的名字
#include <bits/stdc++.h> using namespace std; int main() { int n; string s; cin >> n>>s; int sum = 0, sum2 = 0; for(int i = 0; i < n; i++){ if(s[i] == 'A') sum++; else sum2++; } if(sum > sum2) cout <<"Anton"<<endl; else if(sum2 > sum) cout << "Danik"<<endl; else cout << "Friendship"<<endl; return 0; }
B:题意有限定个数的数字2,3,5,6,让你组成256和32,使得它们的和最大
首先求256的个数,然后再求32的个数
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 long long int a, b, c, d; 8 long long int sum = 0; 9 cin >> a >> b >> c >> d; 10 long long int sa = min(a, min(c, d)); 11 a -= sa; 12 long long int sb = min(a, b); 13 sum = sa*256+32*sb; 14 cout << sum << endl; 15 return 0; 16 }
C:题意需要你生产n瓶药水,你可以用两种方法来减少生产消耗的时间。第一种是改变药水生产的时间,把x改变为a[i],
第二种是立即生产出c[i]瓶药水。当然这两种方法各会消耗b[i]、c[i]的法力值,你的法力值也是有限的。求最少需要
多久能生产这n瓶药水。
枚举第一种方法或者不用,然后能得出剩下的法力值为多少,在第二种方法里用二分即可。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 typedef long long int ll; 5 6 const int MAXN = 2e5+7; 7 8 int a[MAXN], b[MAXN], c[MAXN], d[MAXN]; 9 10 int main() { 11 int n, m, k, x, s; 12 scanf("%d%d%d%d%d", &n, &m, &k, &x, &s); 13 for(int i = 0; i < m; i++) scanf("%d", &a[i]); 14 for(int i = 0; i < m; i++) scanf("%d", &b[i]); 15 for(int i = 0; i < k; i++) scanf("%d", &c[i]); 16 for(int i = 0; i < k; i++) scanf("%d", &d[i]); 17 18 ll sum; 19 int ans = upper_bound(d, d+k, s) - d - 1; 20 if(ans >= 0) sum = 1LL*x*(n-c[ans]); 21 else sum = 1LL*x*n; 22 23 for(int i = 0; i < m; i++) { 24 ll now = s - b[i]; 25 if(now >= 0) { 26 int ans = upper_bound(d, d+k, now)-d-1; 27 if(ans >= 0) { 28 sum = min(sum, 1LL*a[i]*(n-c[ans])); 29 } else { 30 sum = min(sum, 1LL*n*a[i]); 31 } 32 } 33 } 34 printf("%I64d ", sum); 35 return 0; 36 }
D:题意给你一个象棋棋局,里面只有一个白色的国王,和黑色的王后、车、象,让你判断黑棋能否将军。
在枚举国王周围的八个方向,求出最近的棋子是哪些,看看这些棋能否将军。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int INF = 0x7fffffff; 5 char dir[8]; 6 int dist[8]; 7 int xo, yo, n; 8 char chess; 9 int dis(int x, int y){ 10 return max(abs(x-xo), abs(y-yo)); 11 } 12 int pre(int x, int y){ 13 int sx = abs(x - xo), sy = abs(y - yo); 14 if(y == yo && x > xo) return 0; 15 else if(x == xo && y > yo) return 1; 16 else if(y == yo && x < xo) return 2; 17 else if(x == xo && y < yo) return 3; 18 else if(sx == sy && x > xo && y > yo) return 4; 19 else if(sx == sy && x < xo && y > yo) return 5; 20 else if(sx == sy && x > xo && y < yo) return 6; 21 else if(sx == sy && x < xo && y < yo) return 7; 22 return - 1; 23 } 24 int main() { 25 for(int i = 0; i < 8; i++){ 26 dist[i] = INF; 27 dir[i] = '?'; 28 } 29 scanf("%d%d%d", &n, &xo, &yo); 30 int x, y; 31 while(n--){ 32 scanf(" %c%d%d", &chess, &x, &y); 33 int i = pre(x, y); 34 if(i >= 0) { 35 int len = dis(x, y); 36 if(dir[i] == '?' || dist[i] > len){ 37 dist[i] = len; 38 dir[i] = chess; 39 // printf("XX%d ", i); 40 } 41 } 42 } 43 int flag = 0; 44 for(int i = 0; i < 4; i++){ 45 if(dir[i] == 'Q' || dir[i] == 'R') flag = 1; 46 } 47 for(int i = 4; i < 8; i++){ 48 if(dir[i] == 'Q' || dir[i] == 'B') flag = 1; 49 } 50 // for(int i = 0; i < 8; i++){ 51 // printf("%c %d %d ", dir[i], i, dist[i]); 52 // } 53 printf("%s ", flag ? "YES":"NO"); 54 return 0; 55 }
E:题意给你tree,节点被染成黑色或白色,你可以将一个节点附近的(一片区域)相同颜色的节点染成另一种颜色。
问你最少染几次能将这个tree染成一种颜色。
把一个节点附近的相同颜色缩成一个点,这不影响以后的操作,然后用两边dfs出这个树的直径deep,
答案为deep/2?从这个直径的中点开始染色然后次数最少,故为deep/2
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int MAX_V = 200005; 5 vector<int>G[MAX_V]; 6 int color[MAX_V]; 7 int deep = -1, p; 8 void dfs(int u, int fa, int num){ 9 if(num > deep){ 10 p = u; 11 deep = num; 12 } 13 for(int i = 0; i < (int)G[u].size(); i++){ 14 int v = G[u][i]; 15 if(v == fa) continue; 16 dfs(v, u, num + (color[u]^color[v])); 17 } 18 } 19 int main() { 20 int n, y, x; 21 scanf("%d", &n); 22 for(int i = 1; i <= n; i++) scanf("%d", &color[i]); 23 for(int i = 0; i < n-1; i++){ 24 scanf("%d%d", &x, &y); 25 G[x].push_back(y); 26 G[y].push_back(x); 27 } 28 dfs(1, -1, 1); 29 deep = -1; 30 dfs(p, -1, 1); 31 printf("%d ", deep/2); 32 return 0; 33 }
F:给你两个数组array b, array c, 让按照规定你求出array a;
a + b = a&b + a|b;
能得出a[i] + ∑a = b[i] + c[i] ,求出∑a便可求出a[i]
推出公式∑b + ∑c = 2*n*∑a 然后验证array a是否能得到array b,c;
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int MAXN = 200005; 5 6 int a[MAXN], b[MAXN], c[MAXN], b1[MAXN], c1[MAXN]; 7 int bits[31][MAXN], ans[MAXN]; 8 9 int main() 10 { 11 int n; 12 long long int sum = 0; 13 scanf("%d", &n); 14 for(int i = 0; i < n; i++) scanf("%d", &b[i]), sum += b[i]; 15 for(int i = 0; i < n; i++) scanf("%d", &c[i]), sum += c[i]; 16 sum /= (2*n); 17 for(int i = 0; i < n; i++){ 18 a[i] = (b[i]+c[i]-sum)/n; 19 if(a[i] < 0) { 20 printf("-1 "); 21 exit(0); 22 } 23 } 24 for(int i = 0; i < 31; i++){ 25 for(int j = 0; j < n; j++){ 26 if(a[j]&(1LL<<i)) bits[i][j]++; 27 else bits[i][j] = 0; 28 } 29 } 30 for(int i = 0; i < 31; i++){ 31 for(int j = 0; j < n; j++) ans[i] += bits[i][j]; 32 } 33 for(int i = 0; i < n; i++){ 34 for(int j = 0; j < 31; j++){ 35 int bbase = bits[j][i] ? ans[j] : 0; 36 int cbase = bits[j][i] ? n : ans[j]; 37 b1[i] += bbase << j; 38 c1[i] += cbase << j; 39 } 40 if(b1[i] != b[i] || c1[i] != c[i]) { 41 printf("-1 "); 42 exit(0); 43 } 44 } 45 for(int i = 0; i < n; i++) printf("%d%s", a[i], (i != n-1) ? " ":" "); 46 return 0; 47 }