• A. The Enchanted Forest(思维)


    Problem - 1687A - Codeforces

     

    玛丽莎来到魔法森林采摘蘑菇。

    魔法森林可以用X轴上编号为1到n的n个点来表示。在玛丽莎开始之前,她的朋友帕秋莉用魔法检测了每个点上的蘑菇的初始数量,用a1,a2,...,an表示。

    玛丽莎可以在第0分钟时从森林的任何一点开始。每分钟,以下情况依次发生。

    她从x点移动到y点(|x-y|≤1,可能y=x)。
    她收集了y点上的所有蘑菇。
    森林中的每一个点上都会出现一个新的蘑菇。
    请注意,她不能在第0分钟收集蘑菇。

    现在,玛丽莎想知道她在k分钟后能采到的蘑菇的最大数量。

    输入
    每个测试包含多个测试案例。第一行包含一个整数t(1≤t≤104)--测试案例的数量。测试用例的描述如下。

    每个测试用例的第一行包含两个整数n,k(1≤n≤2⋅105,1≤k≤109)--分别是有蘑菇的位置数和Marisa的时间。

    每个测试案例的第二行包含n个整数a1,a2,...,an(1≤ai≤109)--1,2,...,n点上蘑菇的初始数量。

    保证所有测试用例的n之和不超过2⋅105。

    输出
    对于每个测试案例,打印出Marisa在k分钟后能采到的最大蘑菇数。

    例子
    输入复制
    4
    5 2
    5 6 1 2 3
    5 7
    5 6 1 2 3
    1 2
    999999
    5 70000
    1000000000 1000000000 1000000000 1000000000 1000000000
    outputCopy
    12
    37
    1000000
    5000349985
    备注
    测试案例1。

    玛丽莎可以从x=2开始。在第一分钟内,她移动到x=1并收集5个蘑菇。蘑菇的数量将是[1,7,2,3,4]。在第二分钟,她移动到x=2,收集了7个蘑菇。蘑菇的数量将是[2,1,3,4,5]。2分钟后,玛丽莎收集了12个蘑菇。

    可以证明,收集超过12个蘑菇是不可能的。

    测试案例2。

    这是她可能的移动路径之一。

    2→3→2→1→2→3→4→5
    可以证明,不可能收集超过37个蘑菇。

    题解:
    如果k<=n的情况很好想,肯定是找到区间和最大的段,因为初始有值的点肯定是优的

    但是k>n

    如果我们让时间刚好到时刚好遍历收割完一遍,那么增长速率就是n,即全部。如果当时间到时我们的位置在除端点外的任意位置的话,增长速率的总体就会减少,因为有几个在增长时没有算上,可以拿样例2来举例子,假设从时间刚开始时就从左端出发,跑到最右端后继续拐回来,走两步后停下来,时间到了,那么前的数增长的就没算上,(这里要明白不管最后到端点或者任意位置,总会必定舍弃有n*(n+1)/2个菜,因为跑过后还在增长。那么全部菜的增长就是n*k,可以用 总共的 - 舍弃的 = 得到的)
     

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. #define int long long
    10. //1 1 3 3 3
    11. int n,ans;
    12. int a[200050];
    13. void solve()
    14. {
    15. int n,k;
    16. cin >> n >>k;
    17. for(int i = 1;i <= n;i++)
    18. {
    19. cin >> a[i];
    20. a[i] = a[i-1] + a[i];
    21. }
    22. int ans = 0;
    23. if(k <= n)
    24. {
    25. for(int i = k;i <= n;i++)
    26. {
    27. ans = max(a[i]-a[i-k],ans);
    28. }
    29. cout<<ans+k*(k-1)/2<<"\n";
    30. }
    31. else
    32. {
    33. ans = a[n];
    34. ans += n*k - n*(n+1)/2;
    35. cout<<ans<<"\n";
    36. }
    37. }
    38. signed main()
    39. {
    40. int t = 1;
    41. cin >> t;
    42. while(t--)
    43. {
    44. solve();
    45. }
    46. }
    47. //2 5
    48. //3
    49. //9 7
    50. //2 3 4 3
    51. //1 2 3 4 5
    52. // 3

  • 相关阅读:
    requests正常scrapy异常---终极解决方案
    UE4 Niagara 关卡4.1官方案例解析
    第七章:最新版零基础学习 PYTHON 教程—Python 列表(第七节 -在 Python 中反转列表)
    大数据必学Java基础(十):标识符和关键字
    (附源码)ssm客户信息管理系统 毕业设计 281609
    PM 的个人核心竞争力
    UE4 解决C盘缓存问题
    机器学习:VC维的概念和用途
    SpringBoot 工程打包成jar包&使用外部的配置文件启动
    第二章 MyBatis入门
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/128007657