0
点赞
收藏
分享

微信扫一扫

亮灯时长(秋季每日一题 9)


自习室内有一个智能灯。

之间有 个不同时刻,不妨用 表示,其中

在这

现在,你可以最多额外指定一个时刻(也可以不指定),让管理员在此时刻也拨动开关一次。注意选定的时刻不能与

你的目的是让亮灯的总时长尽可能长。

输出这个最大亮灯总时长。

输入格式
第一行包含整数 ,表示共有

每组数据,第一行包含两个整数

第二行包含 个整数

输出格式
输出一个整数,表示最大亮灯总时长。

数据范围




同一测试点内所有 的和不超过

输入样例:

3
3 10
4 6 7
2 12
1 10
2 7
3 4

输出样例:

8
9
6

  • 当在奇数区间拨动开关时,总的亮灯时间等于
    前(i-1)区间中奇数区间的和+(i+1)区间后偶数区间的和+(t-1)
  • 当在偶数区间拨动开关时,总的亮灯时间等于
    前(i-1)区间中奇数区间的和+(i+1)区间后偶数区间的和+(t-1)

#include<iostream>

using namespace std;

const int N = 100010;

int n, m;
int a[N], s1[N], s2[N];

int main(){

int t;
scanf("%d", &t);

while(t--){

scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
a[++n] = m;

s1[0] = s2[0] = 0;
for(int i = 1; i <= n; i++){
s1[i] = s1[i-1];
s2[i] = s2[i-1];

if(i % 2) s1[i] += a[i] - a[i-1];
else s2[i] += a[i] - a[i-1];
}

int res = s1[n];
for(int i = 1; i <= n; i++){

int t = a[i] - a[i-1];
if(t == 1) continue;

res = max(res, t-1+s1[i-1]+s2[n]-s2[i]);
}

printf("%d\n", res);

}

return 0;
}


举报

相关推荐

0 条评论