比赛链接
A. Buttons
博弈、最优策略一定是先去按都能按的按钮,按完之后再按自己的。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;int main()
{IOSint _;cin >> _;while(_ --){ll a, b, c;cin >> a >> b >> c;a += (c + 1) / 2, b += c / 2;if(a > b)cout << "First" << endl;else cout << "Second" << endl;}return 0;
}
B. The Walkway
阅读理解,难点在英语。
每隔d位至少要吃一次饼干,其实可以看商人与商人之间的距离是多少,商人与商人之间的距离除d就是这段距离内吃的饼干数,可以用一个数组来记录每个商人前有多少个空位。
然后枚举计算删掉每一个商人后的贡献就好了。
注意第一个商人在不在第一个长椅旁这里需要多考虑一下,记得特判。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;int a[N], b[N];void solve()
{int n, m, d;cin >> n >> m >> d;for(int i = 1; i <= m; i ++){cin >> a[i];}a[0] = 0, b[0] = 0;if(a[1] == 1)b[1] = 0;else b[1] = a[1] - 2;for(int i = 2; i <= m; i ++){b[i] = a[i] - a[i - 1] - 1;}b[m + 1] = n - a[m];map<int, int> mp;ll ans = 0;if(a[1] != 1)ans ++;for(int i = 1; i <= m; i ++){ans ++;ans += b[i] / d;}ans += b[m + 1] / d;int maxn = 0;for(int i = 2; i <= m; i ++){int A = b[i] / d + b[i + 1] / d + 1;int B = (b[i] + b[i + 1] + 1) / d;maxn = max(maxn, A - B);mp[A - B] ++;}if(a[1] == 1){int A = 1 + b[2] / d;int B = 1 + b[2] / d;maxn = max(maxn, A - B);mp[A - B] ++;}else{int i = 1;int A = b[i] / d + b[i + 1] / d + 1;int B = (b[i] + b[i + 1] + 1) / d;maxn = max(maxn, A - B);mp[A - B] ++;}cout << ans - maxn << ' ' << mp[maxn] << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}
C. Yet Another Permutation Problem
贪心。
既然要求d的种类多,那就尽可能的增加d中数字的种类数,怎么增加呢?从小往大加就好了,比如说2后面放4,3后面放6,4后面放8,就像这样连续下去d中的种类数一定是最多的。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;bool st[N];void solve()
{memset(st, false, sizeof st);int n;cin >> n;st[1] = true;cout << 1 << ' ';for(int i = 2; i <= n / 2; i ++){if(st[i])continue;int j = i;while(j <= n){st[j] = true;cout << j << ' ';j *= 2;}}for(int i = 1; i <= n; i ++){if(!st[i])cout << i << ' ';}cout << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}