难得有一场ak了,写一下自己的做法吧
完全数
支持 做法,直接根号内试除统计即可。
读入用
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 5; const int mod = 998244353; int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); ll n; cin >> n; ll ans = 0; for(ll i = 2; i * i <= n; i++) { if(n % i == 0) { ans += n / i; ans += i; if(n / i == i) ans -= i; } } ans++; if(ans == n) { cout << "Pure\n"; } else if(ans > n) { cout << "Late\n"; } else { cout << "Early\n"; } return 0; }
移动撤销
如果不是 对于每个操作改变 坐标,把相应操作丢到栈里
如果是 ,栈空时不管,否则取出栈首元素,反着改变它的 坐标
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 5; const int mod = 998244353; int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int n; cin >> n; string s; cin >> s; stack<char> st; int l = 0, r = 0; for(auto & x : s) { if(x == 'W') { r++; st.push(x); } else if(x == 'A') { l--; st.push(x); } else if(x == 'S') { r--; st.push(x); } else if(x == 'D') { l++; st.push(x); } else if(x == 'Z') { if(!st.empty()) { auto tmp = st.top(); st.pop(); if(tmp == 'W') { r--; //st.push('S'); } else if(tmp == 'A') { l++; //st.push('D'); } else if(tmp == 'S') { r++; //st.push('W'); } else if(tmp == 'D') { l--; //st.push('A'); } } } //cout << l << ' ' << r << '\n'; } cout << l << ' ' << r << '\n'; return 0; }
石头剪刀布
不知道第几遍做这个题了
贪心,先算牛牛能赢牛妹的,每次取对应方案的min就可以统计出来,然后把对应的石头剪刀布次数减去。最后再计算平手的就可以了。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 5; int a[N], b[N]; const int mod = 998244353; int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int n; cin >> n; for(int i = 1; i <= 3; i++) cin >> a[i]; for(int i = 1; i <= 3; i++) cin >> b[i]; int ans = 0; int num1 = min(a[1], b[2]); a[1] -= num1, b[2] -= num1; ans += num1 * 2; //cout << ans << endl; int num2 = min(a[2], b[3]); a[2] -= num2, b[3] -= num2; ans += num2 * 2; //cout << ans << endl; int num3 = min(a[3], b[1]); a[3] -= num3, b[1] -= num3; ans += num3 * 2; //cout << ans << endl; cout << ans + min(a[1], b[1]) + min(a[2], b[2]) + min(a[3], b[3]) << '\n'; return 0; }
夹缝中求和
对于不等式 做变换得到
那么先对序列排序,枚举每个 ,在序列上二分找到 的符合条件数字就可以了。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 5; int a[N]; const int mod = 998244353; int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int n, x, y; cin >> n >> x >> y; for(int i = 1; i <= n; i++) { cin >> a[i]; } sort(a + 1, a + 1 + n); ll ans = 0; for(int i = 1; i <= n; i++) { int l = x - a[i]; int r = y - a[i]; int posl = lower_bound(a + 1 + i, a + 1 + n, l) - a - 1; int posr = upper_bound(a + 1 + i, a + 1 + n, r) - a - 1; posr--; ans += posr - posl + 1; } cout << ans << '\n'; return 0; }