小白入门赛8
1
#include<bits/stdc++.h>
using namespace std;int main(){puts("5060");return 0;
}
2
只考虑两个字符串a,b的情况下,优先让 a + b a+b a+b 或 b + a b+a b+a 中最小的放前面,据此排序
int n;
string s[200010];
void solve(){cin >> n;for(int i = 1; i <= n; i ++){cin >> s[i];}sort(s + 1, s + n + 1, [](string &a, string &b){return a + b < b + a;});for(int i = 1; i <= n; i ++){cout << s[i];}
}
3
平方个位数的循环如下 :
(x ^ p) % 10
循环节的最小公倍数是 4
x = 0 : 0
x = 1 : 一定是 1
x = 2, 2 4 8 6 ...
x = 3, 3 9 7 1 ...
x = 4, 4 6 ..
x = 5, 5
x = 6, 6
x = 7, 7 9 3 1 ...
x = 8, 8 4 2 6
x = 9, 9 1
循环次数的最小公倍数是 4
读入 x x x 时对 4 4 4 取模,读入 p p p 的时候对 4 4 4 取模,因为个位数每四个一循环,最后输出个位数是什么即可
void solve(){int x, res = 0;string p;cin >> x >> p;x %= 10;for(int i = 0; i < (int)p.size(); i ++){res = res * 10 + p[i] - '0';res %= 4;}res = (res == 0 ? 4 : res);int ans = 1;for(int i = 1; i <= res; i ++){ans = ans * x;}cout << ans % 10 << '\n';
}
4
发现只要假定 x 1 x_1 x1 的数值,其余值都可以递推求解,又因为 x 1 x_1 x1 的取模只有两种,所以每种都试一下
int n, a[200010], x[200010];
void solve(){cin >> n;for(int i = 1; i <= n; i ++){cin >> a[i];}x[0] = 0, x[n + 1] = 0;x[1] = 0;for(int i = 2; i <= n; i ++){x[i] = a[i - 1] - x[i - 1] - x[i - 2];if(x[i] < 0 || x[i] > 1){goto fg;}}if(x[n - 1] + x[n] == a[n]){for(int i = 1; i <= n; i ++){cout << x[i] << ' ';}return ;}fg:x[1] = 1;for(int i = 2; i <= n; i ++){x[i] = a[i - 1] - x[i - 1] - x[i - 2];}for(int i = 1; i <= n; i ++){cout << x[i] << ' ';}
}
5
分情况讨论,首先因为操作 2 2 2 的次数不限,因此先将 a a a 排序,那么中间的元素一定满足要求。
接下来只需要修改首尾元素使之合法即可。
定义位置 x x x 位于块代表 a x = a x − 1 a_x=a_{x-1} ax=ax−1 或 a x = a x + 1 a_x=a_{x+1} ax=ax+1
-
n = 2, 只要不是 [x, x] 的形式,就要修改一次
-
n >= 2 的情况 :
-
首尾元素都位于块,如 1 1 2 3 4 5 5, 这种情况不需要修改
-
首尾元素只有一个位于块,如 1 1 2 3,这种情况下,一定要修改一个元素,答案的下界是 1 1 1 , 假设尾元素不位于块,我们令 a n = a n − 1 a_n=a_{n-1} an=an−1 即可,这样首尾元素都位于块,答案为 1 1 1
-
首尾元素都不位于块, 只要 1 1 1 位于块或者 n − 2 n-2 n−2 位于块即可,如 1 2 3 4 4 5,
将 5 改为 1, 在移动到 1 与 1 组成块接即。如果 1 1 1 和 n − 2 n-2 n−2 都不位于块, 此时需要修改 2 2 2 次
-
int n, a[105];
int l(int p){return (p - 1 + n) % n;
}
int r(int p){return (p + 1) % n;
}
bool check(int i){return a[i] == a[l(i)] || a[i] == a[r(i)];
}
void solve(){cin >> n;for(int i = 0; i < n; i ++){cin >> a[i];}sort(a, a + n);if(n == 2){cout << (a[0] == a[1] ? 0 : 1) << '\n';}else if(check(0) && check(n - 1)){ // 首尾都位于块, 0 次操作cout << "0\n";}else if(!check(0) && !check(n - 1)){ // 首尾都是单独一个if(check(1) || check(n - 2)) cout << "1\n";else cout << "2\n";}else{cout << "1\n";}
}
6
枚举走到的下界分数与上界分数,只要 x x x 位于他们之间即可
理由 : 最小路径调整到最大路径的过程中,每次可以少走一个 − 1 -1 −1 , 或者本来走 1 1 1 现在走 − 1 -1 −1, 因此可以调整到中间的任意值
void solve(){int n, x;cin >> n >> x;vector<int> a(n + 5), f(n + 5), g(n + 5);for(int i = 1; i <= n; i ++){cin >> a[i];} a[n + 1] = 0;f[1] = a[1], g[1] = a[1];f[2] = max(a[1] + a[2], a[2]), g[2] = min(a[1] + a[2], a[2]);for(int i = 3; i <= n + 1; i ++){f[i] = max(f[i - 2], f[i - 1]) + a[i];g[i] = min(g[i - 2], g[i - 1]) + a[i];}// cout << f[n + 1] << ' ' << g[n + 1] << '\n';cout << ((x >= g[n + 1] && x <= f[n + 1]) ? "Yes" : "No") << '\n';
}