当前位置:   article > 正文

Educational Codeforces Round 46 (Rated for Div. 2) B Light It Up_div2 light it up

div2 light it up

题意:给了n个数和一个最长时间M,不断进行关灯,开灯,关灯。。操作。0时刻灯开着,在a[1],a[2]....a[n],M时刻改变灯原来的状态(由开->关/由关->开),能够加一次/不加改变灯的状态的操作,问最长开灯时间是多少

分析:贪心,每次在关灯之后紧接着开灯时间较优,利用前缀和求出每一个时刻之前开灯的时间,然后在每一个时刻之后加一个改变灯的状态的操作,改变灯的状态之后,前面的时刻开灯时间不变,后面的时刻开灯时间变成关灯时间,关灯时间变成开灯时间,求出关灯时间为M-a[i] - (ans[n + 1] - ans[i]),再加上开灯时间减去1即可

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn = 1e5 + 10;
  5. ll a[maxn],ans[maxn];
  6. int main()
  7. {
  8. ll n,m;
  9. cin>>n>>m;
  10. for(int i = 1; i <= n; i++)
  11. cin>>a[i];
  12. int flag = 1;
  13. a[n + 1] = m;
  14. for(int i = 1; i <= n + 1; i++)//i之前开着的时间
  15. {
  16. ans[i] = ans[i - 1] + flag * (a[i] - a[i - 1]);
  17. flag ^= 1;
  18. }
  19. ll res = ans[n + 1];
  20. for(int i = 1; i <= n; i++)
  21. {
  22. res = max(res,ans[i] - 1 + m - a[i] - (ans[n + 1] - ans[i]));
  23. }
  24. cout<<res<<endl;
  25. return 0;
  26. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/912671
推荐阅读
相关标签
  

闽ICP备14008679号