Problem A. Alice and Bob
题意:告诉你两堆石子的数量,每次可以从一堆拿k(k>0)个且从另一堆那s*k(可为0)个。每个人都采取最优的方法,问最后谁赢。
思路:这个题想了一会就是去找必败态,脑跑找了几组后发现没规律就准备打表,但是找错了一组(14,19),正解应该是(14,20),导致打表都打错了。。。
假设(x,y)是一个必败态,那么可由(x,y)->(x1,y1)就不是必败态,所以由题意可得非必败态就是(x+k,y+s*k)或者(x+s*k,y+k),打表即可。
代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int N = 5e3 + 10; bool sg[N][N]; int main() { //打表 for (int i = 0; i <= 5000; i++) { for (int j = 0; j <= 5000; j++) { if (!sg[i][j]) { for (int k = 1; k + i <= 5000; k++) { for (int s = 0; s * k + j <= 5000; s++) { sg[k + i][s * k + j] = 1; } } for (int k = 1; k + j <= 5000; k++) { for (int s = 0; s * k + i <= 5000; s++) { sg[s * k + i][k + j] = 1; } } } } } int t; cin >> t; int n, m; while (t--) { cin >> n >> m; if (sg[n][m]) cout << "Alice" << endl; else cout << "Bob" << endl; } return 0; }
Problem B. Ball Dropping
题意:告诉你半径r、上底a、下底b、高度h,问是否会被卡住,否输出Drop,是输出Stuck和圆心到下底的距离。
思路:首先,2*r<b不会被卡住。如果卡住了,我们通过圆心向右做一条辅助线到等腰梯形腰上,并通过相似三角形求出这段长度,再通过相似求出圆心到下底的距离。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e3 + 5; const double eps = 1e-6; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); double r, a, b, h; cin >> r >> a >> b >> h; if(2*r<b) { cout << "Drop" << endl; } else { double c=sqrt((a-b)/2*(a-b)/2+h*h); double d = c * r / h; double e = d - b / 2; double H = h * e / ((a - b) / 2); cout << "Stuck" << endl; if(H>=eps) printf("%.10lf\n", H); } return 0; }Problem C. Cut the Tree
Problem D. Determine the Photo Position
题意:给你n*n的区域,0代表空位,1代表学生,现在有m个老师,问这m个老师加入这片区域有多少种方法,前提m个老师必须是横着连续一排。
思路:这场的签到题,没啥好说的。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e3 + 5; char a[N][N]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; for (int i = 1; i <= n;i++){ for (int j = 1; j <= n;j++){ cin >> a[i][j]; } } string s; cin >> s; ll sum = 0; for (int i = 1; i <= n;i++){ int cnt = 0; for (int j = 1; j <= n;j++){ if(a[i][j]=='1') { cnt = 0; } else { cnt++; if(cnt>=m) { sum++; } } } } cout << sum << endl; return 0; }
Problem E. Escape along Water Pipe Problem
Problem F. Find 3-friendly Integers
题意:给你一个区间[L,R],问这个区间内有多少个数能被3整除或者这个数的子串能被3整除,其中0 mod 3 = 0。
思路:通过观察可以发现当这个数大于等于100那它必定满足题目要求,那么我们只要判断一下小于100的即可。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e3 + 5; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--) { ll l, r; cin >> l >> r; ll sum = 0; if(r<=100) { for (ll i = l; i <= r;i++) { int temp=i; if(temp%3==0) { sum++; //cout << temp << endl; continue; } while (temp) { if(temp%3==0) { sum++; break; } ll tmp = i % 10; if (tmp == 0 || (tmp % 3 == 0)) { sum++; //cout << i << endl; break; } temp/=10; } } } else { if(l<=100) { sum += r - 100; for (ll i = l; i <= 100;i++) { int temp=i; if(temp%3==0) { sum++; continue; } while (temp) { if(temp%3==0) { sum++; break; } ll tmp = i % 10; if (tmp == 0 || (tmp % 3 == 0)) { sum++; break; } temp/=10; } } } else { sum += r - l + 1; } } cout << sum << endl; } return 0; }
Problem G. Game of Swapping Numbers
题意:给你长度为n的序列a和b,你可以任意交换a中两个数k次,问所有ai-bi的绝对值和的最大值是多少。
思路:先去掉绝对值,那ai和bi一定有一正一负,因为是计算绝对值,交换对应的ai和bi不影响他们的结果,所以我们先通过交换优先保证ai>bi,计算出当前差值。然后我们通过对a序列从小到大排序,对b序列从大到小排序,将a中最小的与b中最大的交换位置,此时结果变优了2*(b[i]-a[i]),因为我们相当于改变了他们的符号,从正变负从负变正,所以要乘上2。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 5; const double eps = 1e-6; int a[N], b[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, k; cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; ll ans = 0; for (int i = 1; i <= n; i++) { if (a[i] < b[i]) swap(a[i], b[i]); ans += abs(a[i] - b[i]); } if (n == 2) { if (k % 2) cout << abs(a[1] - b[2]) + abs(a[2] - b[1]) << endl; else cout << abs(a[1] - b[1]) + abs(a[2] - b[2]) << endl; return 0; } sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + n, greater<int>()); for (int i = 1; i <= n && i <= k; i++) { if (b[i] < a[i]) break; ans += 2 * (b[i] - a[i]); } cout << ans << endl; return 0; }Problem H. Hash Function
Problem I. Increasing Subsequence
Problem J. Journey among Railway Stations
Problem K. Knowledge Test about Match