Zong Jie
总 结你酒桶玩得和屎一样,一个赛季练个纳尔有这么难吗? 这两场打得都很差,一直在扣分,本来就没几分,还嗯扣。我不想把借口归结于自己以外,但是我觉得这比赛不适合在宿舍打,最好的办法就是快点去竞赛队才有条件。在宿舍一关灯听那几个D能鬼叫能想个勾吧。
A : 颁奖台,EZ
#includeusing namespace std; signed main() { int t; cin >> t; while (t--) { int m; cin >> m; int k = m; while (k % 3 != 0) { k++; } int n = (k / 3) + 1; int a, b, c; a = n - 1; b = n; c = m - a - b; if (c == 0) { a--; c = 1; } printf("%d %d %dn", a, b, c); } system("pause"); return 0; }
B :不理解到底哪里会错。思路就是看看除了B[i] = 0 的数,a[i] - b[i] 是否相等,大家都相等就可以,a[i] < b[i] 也是不行的。敲的第一遍怎么改都改不对啊,第二天一早上重新写就对了,什么玩意?
#includeusing namespace std; int a[500010], b[500010], s[500010]; int maxn(int aa, int bb) { if (aa > bb) return aa; return bb; } signed main() { int t; cin >> t; while (t--) { int n, len = 1; bool stdown = false; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> b[i]; } int maxn = -1; for (int i = 1; i <= n; i++) { if (a[i] < b[i]) { stdown = true; } maxn = max(maxn, a[i] - b[i]); } for (int i = 1; i <= n; i++) { if (b[i] != 0) { if (a[i] - b[i] < maxn) { stdown = true; } } } if (stdown) { cout << "NO" << endl; continue; } cout << "YES" << endl; } system("pause"); return 0; }
C :画一条直线会方便理解很多,比较一下是当前任务先结束还是下一个任务先来,持续时间永远是减去在后面的那个。
比如样例,上一个任务在10分钟完成,下一个任务在7分钟来到,那么取max(10,7) = 10,所以要11-10
#include#define int long long const int N = 2e5 + 10; using namespace std; int a[N], b[N]; int max(int aa, int bb) { if (aa > bb) return aa; return bb; } int min(int aa, int bb) { if (aa < bb) return aa; return bb; } void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> b[i]; } cout << b[1] - a[1] << ' '; for (int i = 2; i <= n; i++) { cout << b[i] - max(a[i], b[i - 1]) << ' '; } } signed main() { int t; cin >> t; while (t--) { solve(); cout << endl; } system("pause"); return 0; }
D : 这一段代码的作用是统计在这之前(包括这)有多少个白,其实可以理解为如果从开头涂到它,可以涂 a[i] 个白色。对于长度 K 来说,要涂的长度就是 a[i] - a[i-k] ,所以解法就是枚举长度K,取最小,最坏的情况是要涂K个白格子,所以初始化 ans = K;
#include#include #define int long long const int N = 2e5 + 10; using namespace std; int a[N]; int min(int aa, int bb) { if (aa < bb) return aa; return bb; } void solve() { int n, k; string s; cin >> n >> k; cin >> s; s = " " + s; int x = 0; a[0] = 0; for (int i = 1; i <= n; i++) { if (s[i] == 'W') { x = 1; } else x = 0; a[i] = a[i - 1] + x; } int ans = k; for (int i = k; i <= n; i++) { ans = min(ans, a[i] - a[i - k]); } cout << ans << endl; } signed main() { int t; cin >> t; while (t--) { solve(); } system("pause"); return 0; }
E :
首先你要知道,对于一个数 W / K = ans ....... mod 我们把 W 拆成 A + B;
那么有:
A / K + B / K + ( A % K + B % K ) / K = ans
( A % K + B % K ) % K = mod
所以先处理加和每个商品整除了 K 的值,在把 %K 的值两两组合,凑ans,最后总价值就把数字都加起来。
#include #include#include #define int long long using namespace std; const int N = 2e5 + 10; int a[N]; bool cmd(int a, int b) { return a < b; } void solve() { int n, k, w = 0; cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { w += a[i] / k; a[i] %= k; } sort(a + 1, a + n + 1, cmd); int l = 1, r = n; while (l != r) { if (l > r) { break; } if (a[l] + a[r] >= k) { w += (a[l] + a[r]) / k; l++; r--; } else { l++; } } cout << w << endl; return; } signed main() { int t; cin >> t; while (t--) { solve(); } system("pause"); return 0; }



