• Codeforces Round 929 (Div. 3)---->E. Turtle vs. Rabbit Race: Optimal Trainings


    一,思路:

    1,做这题如果对二分敏感的话,看完题目就大概很容易想到,通过二分来找到一个 r ,使得 [ l, r] 之间的和最接近 u (因为这样才是 Isaac 所能获得的最大提升)。

    2,还有一个特殊情况,结合代码来说明。

    二,代码

    1. #include <iostream>
    2. #include<cstring>
    3. #include<algorithm>
    4. using namespace std;
    5. const int N = 1e5+10;
    6. typedef long long ll;
    7. int arr[N];
    8. ll pre[N];
    9. //u--->题目输入的目标值
    10. //st---> 题目输入的起始坐标
    11. int u,st;
    12. //重写二分比较函数
    13. bool check(int mid) {
    14. if (pre[mid] - pre[st - 1] <= u) return true;
    15. return false;
    16. }
    17. void sovle() {
    18. int n;
    19. cin >> n;
    20. for (int i = 0; i <= n; i++) pre[i] = 0;
    21. for (int i = 1; i <= n; i++) {
    22. cin >> arr[i];
    23. pre[i] = pre[i - 1] + arr[i];
    24. }
    25. int q;
    26. cin >> q;
    27. while (q--) {
    28. cin >> st >> u;
    29. int l=st,r = n;
    30. //二分模板
    31. while (l < r) {
    32. int mid = l + r + 1>> 1;
    33. if (check(mid)) l = mid;
    34. else r = mid - 1;
    35. }
    36. //特殊情况:
    37. // 1.首先要知道,我们求得的 r只是 [l,r]之和小于等于u的那个位置,不一定是最接近的那个点。
    38. // 2.举个例子:
    39. //1)例如 数组:[1 ,2 ,8] ,目标值u = 10 , 起始位置 l = 1
    40. 2)这里我们二分求得的是 r =21 + 2 = 3 < 10),但是明显 r=3 时更接近 u
    41. // 3.还有个陷阱,就是当他们的差距相等时,是选 r +1 还是 r 呢?如果不仔细分析的话,很容易
    42. // 就会想当然认为是 r,因为 r < r +1.实则不是,这里我就不举例了,你们自己可以将下面的判断
    43. // 改成 u - (pre[r] - pre[st - 1]) <= (pre[r + 1] - pre[st - 1]) - u 试一下,看是什么
    44. // 结果,然后再去找出问题即可。
    45. //判断离目标值最近的点是 r 还是 r +1
    46. if (r == n || u - (pre[r] - pre[st - 1]) < (pre[r + 1] - pre[st - 1]) - u) {
    47. cout << r <<" ";
    48. }
    49. else cout << r + 1 << " ";
    50. }
    51. cout << endl;
    52. }
    53. int main()
    54. {
    55. ios::sync_with_stdio(false);
    56. cin.tie(0);
    57. int t;
    58. cin >> t;
    59. while (t--) {
    60. sovle();
    61. }
    62. return 0;
    63. }

  • 相关阅读:
    ctfshow unserialize
    nvm的安装、使用及常见问题汇总
    Lua 模块与包
    一篇教你学会Ansible
    阿里巴巴面试题- - -Java体系最新面试题(2)
    C#(四十)之stringBuilder类
    光纤环形镜FBG传感器
    JS高级:Web Workers高级(多线程)
    【Java】方法重写
    Vagrant的安装和使用(附带安装Centos 7教程)
  • 原文地址:https://blog.csdn.net/qq_75103498/article/details/136352309