A - Leap Year
思路: i f if if e l s e else else判断
void solve() {
int n; cin >> n;
if (n % 4) cout << 365 << '\n';
else if (n % 4 == 0 && n % 4) cout << 366 << '\n';
else if (n % 100 == 0 && n % 400) cout << 365 << '\n';
else cout << 366 << '\n';
}
B - Second Best
思路:模拟题意即可
void solve() {
int n; cin >> n;
vector<int> a(n + 1);
map<int, int> mp;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
mp[a[i]] = i;
}
sort(a.begin() + 1, a.end());
cout << mp[a[n - 1]] << '\n';
}
C - Transportation Expenses
思路:只要我的总和不大于 m m m,就是可以取无限,其他情况直接二分答案, O ( n ) c h e c k O(n)check O(n)check就行
void solve() {
int n, m; cin >> n >> m;
vector<int> a(n + 1);
int sum = 0;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
sum += a[i];
}
if (sum <= m) {
cout << "infinite" << '\n';
return ;
}
auto check = [&](int x) -> bool {
int res = 0;
for (int i = 1; i <= n; i ++) {
res += min(a[i], x);
}
return res <= m;
};
int l = 0, r = sum, ans = -1;
while (l <= r) {
int mid = l + r >> 1;
if (check(mid)) l = mid + 1, ans = mid;
else r = mid - 1;
}
cout << ans << '\n';
}
D - AtCoder Janken 3
思路:非常典的 d p dp dp, d p [ i ] [ 0 / 1 / 2 ] dp[i][0/1/2] dp[i][0/1/2]表示在第 i i i个位置分别选字符 R R R P P P S S S的最大获胜局数,我们每次只能选能让我本局赢得或者平局得字符,并且要由和当前这个字符不同得转移过来,具体看代码
int n; cin >> n;
string s; cin >> s; s = " " + s;
vector<array<int, 3>> dp(n + 2);
for (int i = 1; i < s.size(); i ++) {
if (s[i] == 'R') {
dp[i][0] = max(dp[i - 1][2], dp[i - 1][1]);
dp[i][1] = max(dp[i - 1][0], dp[i - 1][2]) + 1;
} else if (s[i] == 'P') {
dp[i][1] = max(dp[i - 1][0], dp[i - 1][2]);
dp[i][2] = max(dp[i - 1][0], dp[i - 1][1]) + 1;
} else {
dp[i][2] = max(dp[i - 1][0], dp[i - 1][1]);
dp[i][0] = max(dp[i - 1][1], dp[i - 1][2]) + 1;
}
}
if (s.back() == 'R') cout << max(dp[n][0], dp[n][1]);
else if (s.back() == 'P') cout << max(dp[n][1], dp[n][2]);
else cout << max(dp[n][0], dp[n][2]);
}
E - Xor Sigma Problem
蓝桥杯原题
思路:这个题暴力肯定会超时,那什么情况下会对答案有贡献,是不是一个是我区间里
1
1
1的个数为奇数的时候对答案有贡献,所以去统计在每一位的情况下前缀异或和里面
1
1
1和
0
0
0出现的数量,将他们组合一下在乘以这位的贡献
int n; cin >> n;
vector<int> pre(n + 1);
int sum = 0;
for (int i = 1, x; i <= n; i ++) {
cin >> x;
pre[i] = pre[i - 1] ^ x;
sum += x;
}
int ans = 0;
for (int j = 0; j < 31; j ++) {
int c[2] = {0, 0};
for (int i = 0; i <= n; i ++) {
c[pre[i] >> j & 1] ++;
}
// debug2(c[0], c[1]);
// debug1(j);
ans += (1ll << j) * c[1] * c[0];
}
cout << ans - sum << '\n';
F - Takahashi on Grid
G - AtCoder Office