intsolve(){ int ans = 0; for (int i = 1; i < n - 1; i++) { if (h[i] > h[i - 1] && h[i] > h[i + 1]) { ans++; } } return ans; }
intmain(){ cin >> t; for (int i = 1; i <= t; i++) { cin >> n; for (int i = 0; i < n; i++) { cin >> h[i]; } printf("Case #%d: %d\n", i, solve()); } return0; }
B. Bus Routes
题目大意
N 条公交路线,第 i 个路线每 Xi 天开一次(在第Xi,2Xi,⋯天开),要把所有公交路线在 D 天内按照编号由小到大的顺序都乘一遍,求乘第一个公交的最晚时间。同一天可乘多个公交,保证 D 天内是可完成这个任务的。
解析
对于不需要保证公交乘坐顺序的情况。求 Xi 小于等于 D 但是离 D 最近的数即可,得到一个新的数组之后,数组的最小值就是答案。注意 D 最大可到 1021,超过 int32 范围,需要用 long long。
对于需要考虑乘坐顺序的情况,需要从最后一个公交路线开始选择,这个公交路线的乘坐时间一旦确定,之前的公交路线需要都在此时间之前(<=关系),这可以通过更新 D 为此公交路线的乘坐时间即可。
代码
#include<algorithm> #include<iostream>
usingnamespacestd;
int t, n; longlong d, x[1005];
longlongsolve(){ longlong ans = __LONG_LONG_MAX__; for (int i = n - 1; i >= 0; i--) { // 离 d 最近的 x[i] 的倍数 x[i] = d / x[i] * x[i]; ans = min(ans, x[i]); d = min(d, x[i]); } return ans; }
intmain(){ cin >> t; for (int i = 1; i <= t; i++) { cin >> n >> d; for (int i = 0; i < n; i++) { cin >> x[i]; } printf("Case #%d: %lld\n", i, solve()); } return0; }
C. Robot Path Decoding
题目大意
109×109 的网格,从 (1,1) 坐标开始,经过一系列行走的指令,求最终到达的坐标。关键在于对指令字符串的处理,N, S, E, W 表示四个方向,可以使用数字表示同一指令的多次重复。注意坐标 109 再往右走会回到 1。
2(NWE) is equivalent to NWENWE. 3(S2(E)) is equivalent to SEESEESEE. EEEE4(N)2(SS) is equivalent to EEEENNNNSSSS.
// dp 中存放失败概率 int t, w, h, l, u, r, d; float dp[100005];
floatsolve(){ // 如果右下角是 hole if (w == r && h == d) return0; dp[w] = 0; // 处理最后一行 for (int i = w - 1; i >= 1; i--) { if (h == d && i >= l && i <= r) dp[i] = 1; else dp[i] = dp[i + 1]; } // 处理上面的行 for (int i = h - 1; i >= 1; i--) { for (int j = w; j >= 1; j--) { if (i >= u && i <= d && j >= l && j <= r) dp[j] = 1; elseif (j != w) { dp[j] = 0.5 * dp[j + 1] + 0.5 * dp[j]; } } }
return1 - dp[1]; }
intmain(){ cin >> t; for (int i = 1; i <= t; i++) { cin >> w >> h >> l >> u >> r >> d; printf("Case #%d: %f\n", i, solve()); } return0; }
int left_sum = l - 1 + d + 1, right_sum = r + 1 + u - 1; // 左下角 for (int i = l - 1, j = d + 1; i >= 1 && j <= h; i--, j++) { if (j == h) { ans += last_h[i]; } else // 总共需要 left_sum - 2 步,i - 1 步向右 ans += cal(left_sum - 2, i - 1); } // 右上角 for (int i = r + 1, j = u - 1; i <= w && j >= 1; i++, j--) { if (i == w) { ans += last_w[j]; } else ans += cal(right_sum - 2, i - 1); }
return ans; }
intmain(){ cin >> t;
log_2_factorial[0] = 0; for (int i = 1; i < max_n; i++) { log_2_factorial[i] = log_2_factorial[i - 1] + log2(i); }
for (int i = 1; i <= t; i++) { cin >> w >> h >> l >> u >> r >> d; printf("Case #%d: %lf\n", i, solve()); } return0; }