赞
踩
题意:给了n个数和一个最长时间M,不断进行关灯,开灯,关灯。。操作。0时刻灯开着,在a[1],a[2]....a[n],M时刻改变灯原来的状态(由开->关/由关->开),能够加一次/不加改变灯的状态的操作,问最长开灯时间是多少
分析:贪心,每次在关灯之后紧接着开灯时间较优,利用前缀和求出每一个时刻之前开灯的时间,然后在每一个时刻之后加一个改变灯的状态的操作,改变灯的状态之后,前面的时刻开灯时间不变,后面的时刻开灯时间变成关灯时间,关灯时间变成开灯时间,求出关灯时间为M-a[i] - (ans[n + 1] - ans[i]),再加上开灯时间减去1即可
代码
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxn = 1e5 + 10;
- ll a[maxn],ans[maxn];
- int main()
- {
- ll n,m;
- cin>>n>>m;
- for(int i = 1; i <= n; i++)
- cin>>a[i];
- int flag = 1;
- a[n + 1] = m;
- for(int i = 1; i <= n + 1; i++)//i之前开着的时间
- {
- ans[i] = ans[i - 1] + flag * (a[i] - a[i - 1]);
- flag ^= 1;
- }
- ll res = ans[n + 1];
- for(int i = 1; i <= n; i++)
- {
- res = max(res,ans[i] - 1 + m - a[i] - (ans[n + 1] - ans[i]));
- }
- cout<<res<<endl;
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。