这一场涨了不少,题也比较偏思维,正好适合我
A. Non-zero
我们记录这些数字的总和sum,并且记录0的个数zero,显然答案应该是这些0的个数,注意如果sum+zero==0的话答案要额外加一(因为总和不能是0)
#include<bits/stdc++.h> #define LL long long #define maxn 100010 #define x first #define y second using namespace std; typedef pair<int, int> pii; int a[maxn]; int main(){ int T; cin >> T; while(T--){ int n, sum = 0; int z = 0; cin >> n; for(int i = 0; i < n; ++i){ cin >> a[i]; sum = sum + a[i]; if(a[i] == 0){ z++; } } int ans = 0; if(sum == 0){ ans = 1; sum++; } if(z != 0){ ans = max(ans, z); if(sum == 1){ sum = sum + ans - 1; } else{ sum = sum + ans; } } if(sum == 0){ ans++; } cout << ans << endl; } return 0; }
B. Assigning to Classes
要使得两组的中位数相差最小,很显然,如果把两组表示为G1和G2,那么如果G1的中位数更靠前,那么G2的中位数一定更靠后,那么易得当这俩中位数靠的最近的时候相差最小,此时G1跟G2的中位数应该在数组的中间,直接排序输出数组中间的差值便是答案
#include<bits/stdc++.h> #define LL long long #define maxn 100010 #define inf 0x3f3f3f3f #define x first #define y second using namespace std; typedef pair<int, int> pii; int a[maxn << 1]; int main(){ int T; cin >> T; while(T--){ int n; cin >> n; for(int i = 0; i < 2 * n; ++i){ cin >> a[i]; } sort(a, a + 2 * n); int n1, n2; if(n % 2){ cout << a[n] - a[n - 1] << endl; } else{ cout << a[n] - a[n - 1] << endl; } } return 0; }
C. Anu Has a Function
我们考虑下这一组式子,对于f(a, b)=(a|b)-b函数的结果c的每一二进制位,如果这一位上b是1,那么容易知道c这一位一定是0,否则c这一位是看a这一位是否为1,很显然,c的二进制上为1的位一定是a这一位为1,b这一位为0的地方。所以推广到很多个b,就是a这一位为1,很多个b那一位全是0的时候,答案这一位才是0,取最大值就行了,我的处理方式还是比较简单的。
#include<bits/stdc++.h> #define LL long long #define maxn 100010 #define inf 0x3f3f3f3f #define x first #define y second using namespace std; typedef pair<int, int> pii; int a[maxn]; int bit[50]; void _in(int num){ int now = 0; while(num){ if(num & 1){ bit[now]++; } num = num >> 1; now++; } } int _out(int num){ int now = 0, ret = 0; while(num){ if(num & 1 && bit[now] == 1){ ret = ret + (1 << now); } num = num >> 1; now++; } return ret; } int main(){ int n; cin >> n; memset(bit, 0, sizeof bit); for(int i = 0; i < n; ++i){ cin >> a[i]; _in(a[i]); } int ma = 0, no = -1; for(int i = 0; i < n; ++i){ if(_out(a[i]) > ma){ ma = _out(a[i]); no = i; } } if(no >= 0){ cout << a[no] << " "; } for(int i = 0; i < n; ++i){ if(i != no){ cout << a[i] << " "; } } cout << endl; return 0; }
D. Aerodynamic
题意挺麻烦的,但是结论却很简单,必须是中心对称的偶数边数的多边形,我的处理方式居然没被hack,神奇
#include<bits/stdc++.h> #define LL long long #define maxn 100010 #define inf 0x3f3f3f3f #define x first #define y second using namespace std; typedef pair<double, double> pdd; pdd a[maxn]; pdd b[maxn]; int main(){ int n; cin >> n; for(int i = 0; i < n; ++i){ cin >> a[i].x >> a[i].y; if(i > 0){ b[i].x = a[i].x - a[i - 1].x; b[i].y = a[i].y - a[i - 1].y; } } b[0].x = a[0].x - a[n - 1].x; b[0].y = a[0].y - a[n - 1].y; sort(b, b + n); if(n % 2){ cout << "NO" << endl; return 0; } bool ans = true; for(int i = 0; i < n; ++i){ if(b[i].x + b[n - i - 1].x != 0 || b[i].y + b[n - i - 1].y != 0){ ans = false; } } cout << (ans ? "YES" : "NO") << endl; return 0; }
E. Water Balance
最后这个题听学长说是单调栈,还是比较简单明了的写法,但是我没写出来,可惜了
注意这个题取12位小数会WA,一定要取8位小数
这一场排到了576名,rating到了1700+,但是如果没有傻卵错误其实还可以再往前排一点,希望再打几场能上紫名 。