2 条题解
-
2
跳房子比跳石头更复杂一些。找每个g是不是合适需要动态规划。开始写的时候一直不能全对,因为有些石头,哦房子,就是跳不到的不能认为后面的🏠也跳不到。
#include <bits/stdc++.h> #define INF 9223372036854775807 using namespace std; static int pos[500005], val[500005]; static long long b[500005], current_max; int n, k, d; bool got_k(int g) { int longest = d + g, shortest = max(1, d - g); register int left = 0, right = 0; current_max = 0; for (register int i = 1; i <= n; i++) { while (pos[i] - pos[right + 1] >= shortest) { current_max = max(current_max, b[++right]); } while (pos[i] - pos[left] > longest) { left++; if (left == i) return false; if (b[left - 1] == current_max) { current_max = *max_element(b + left, b + right + 1); } } if ((left == right and pos[i] - pos[right] < shortest) or current_max < -5e10 or left > right) { b[i] = -INF; continue; } b[i] = current_max + val[i]; if (b[i] >= k) return true; } return false; } int main() { scanf("%d %d %d\n", &n, &d, &k); pos[0] = 0; val[0] = 0; b[0] = 0; for (register int i = 1; i <= n; i++) scanf("%d %d\n", pos + i, val + i); int left = 0, right = pos[n] - d, res = 2e9; while (left < right) { int mid = (left + right) / 2; if (got_k(mid)) { res = min(res, mid); right = mid; } else { left = mid + 1; } } cout << (res == 2e9 ? -1 : res); return 0; }
-
-2
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 988
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 35
- 已通过
- 17
- 上传者