A 暴力
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <cstring> #include <vector> #include <string> #include <queue> #include <map> using namespace std; map<int, int> mp; int main() { int t; cin >> t; while(t--) { int ans, cnt = 0; mp.clear(); for(int i = 0; i < 5; ++i) { int x; cin >> x; mp[x]++; if(mp[x] > cnt || (mp[x] == cnt && x < ans)) { ans = x; cnt = mp[x]; } } cout << ans << endl; } }B 打表找规律,k分为偶数和奇数情况
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <cstring> #include <vector> #include <string> #include <queue> #include <map> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--) { ll l, r, k; cin >> l >> r >> k; ll ans = 0; if(k & 1) { cout << r - l + 1 << endl; } else { if(l > k) { cout << r - l + 1 - (r - k) / (k + 1) + (l - k - 1) / (k + 1) << endl; } else if(r < k) { cout << r - l + 1 << endl; } else { cout << r - l - (r - k) / (k + 1) << endl; } } } }C 暴力枚举a和b的可能,用前缀和记录保存矩阵内1的数量,每个块内1的数量即为sum/(a+1)(b+1),判断可行性即可
#include <cstdio> #include <vector> const int N = 1000 + 10; char s[N][N]; int g[N][N]; int main() { int T; scanf("%d", &T); for (int cas = 1; cas <= T; ++cas) { int n, m, k; scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; ++i) { scanf("%s", s[i] + 1); } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { g[i][j] = g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1] + (s[i][j] == '0'); } } if (g[n][m] == 0) { for (int i = 1; i <= k; ++i) { printf("%d%c", i, " \n"[i == k]); } continue; } std::vector<int> ret; for (int a = 0; a <= k && a <= n - 1; ++a) { int b = k - a; if (b < 0 || b > m - 1) continue; if (g[n][m] % ((a + 1) * (b + 1))) continue; std::vector<int> xs, ys; int col_sum = g[n][m] / (b + 1); int row_sum = g[n][m] / (a + 1); int avg = g[n][m] / ((a + 1) * (b + 1)); for (int i = 0, j = 0; i <= m; ++i) { if (g[n][i] % col_sum == 0 && g[n][i] / col_sum == j) { ys.push_back(i); ++j; } } if (ys.size() != b + 2) continue; ys.pop_back(); ys.push_back(m); for (int i = 0, j = 0; i <= n; ++i) { if (g[i][m] % row_sum == 0 && g[i][m] / row_sum == j) { xs.push_back(i); ++j; } } if (xs.size() != a + 2) continue; xs.pop_back(); xs.push_back(n); bool valid = true; for (size_t i = 1; i < xs.size() && valid; ++i) { for (size_t j = 1; j < ys.size() && valid; ++j) { int sum = g[xs[i]][ys[j]] - g[xs[i]][ys[j - 1]] - g[xs[i - 1]][ys[j]] + g[xs[i - 1]][ys[j - 1]]; valid &= (sum == avg); } } if (valid) { std::vector<int> tmp; for (int i = 1; i <= a; ++i) tmp.push_back(xs[i]); for (int i = 1; i <= b; ++i) tmp.push_back(ys[i] + n - 1); if (ret.empty() || ret > tmp) ret = tmp; } } if (ret.empty()) puts("Impossible"); else { for (int i = 0; i < k; ++i) { printf("%d%c", ret[i], " \n"[i == k - 1]); } } } return 0; }D 打表找规律,发现10个相加的和一定为45.处理1-x范围内的答案,即分为前能整除10的部分答案为(x/10)*45和后从(x/10)*10到x的部分。 暴力处理后半部分,f(x+i) % 10 = (f(x) + i) % 10
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <cstring> #include <vector> #include <string> #include <queue> #include <map> using namespace std; typedef long long ll; namespace io { const int SIZE = 1e7 + 10; char inbuff[SIZE]; char *l, *r; inline void init() { l = inbuff; r = inbuff + fread(inbuff, 1, SIZE, stdin); } inline char gc() { if (l == r) init(); return (l != r) ? *(l++) : EOF; } void read(int &x) { x = 0; char ch = gc(); while(!isdigit(ch)) ch = gc(); while(isdigit(ch)) x = x * 10 + ch - '0', ch = gc(); } void read(ll &x) { x = 0; char ch = gc(); while(!isdigit(ch)) ch = gc(); while(isdigit(ch)) x = x * 10 + ch - '0', ch = gc(); } } using io::read; int x[100], tot; ll sum(ll a) { //if(a < 10) return (a + 1) * a / 2; ll res = (a / 10) * 45; ll b = (a / 10) * 10; while(true) { tot = 0; while(b) { x[tot++] = b % 10; b /= 10; } for(int i = tot - 1; i >= 1; --i) b = b * 10 + (x[i] + x[i - 1]) % 10; if(b < 10) break; } for(int i = 0; i <= a % 10; ++i) { res += (b + i) % 10; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; read(t); while(t--) { ll l, r; read(l); read(r); printf("%lld\n", sum(r) - sum(l - 1)); } }