Educational Codeforces Round 46 (Rated for Div. 2) B Light It Up

题意:给了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;
}

猜你喜欢

转载自blog.csdn.net/zhlbjtu2016/article/details/81072525