生活随笔
收集整理的這篇文章主要介紹了
B. Light It Up
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
題意
有一盞燈,在0開啟,在M關閉,開始有N個時刻,相鄰時刻分別表示開啟或者關閉。問怎么插入一個時刻使得燈亮的總時間最大,輸出最大值。
AC
- 暴力的枚舉每個區間,計算插入得到的值
- 因為插入一個時刻的話,會打亂之前的順序,所以先對原來的時刻進行預處理,求sum1和sum2
- sum1正常區間的和, sum2是后移一位的區間和
- 當插入一個時刻,分為兩種情況,插入到奇數后,插入到偶數個之后
- 插入到奇數之后:
x - r + sum1[ l ] + sum2[ n ] - sum2[ r ] - 插入到偶數之后:
r - x + sum1[ l ] + sum2[ n ] - sum2[ r ] - 更新最大值即可
#include <iostream>
#include <stdio.h>
#include <map>
#include <math.h>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#define N 100005
#define mem(a, b) memset(a, b, sizeof(a))
#define P pair<int, int>
#define pb push_back
using namespace std;
int a[N];
int sum1[N], sum2[N];
int main() {
#ifndef ONLINE_JUDGEfreopen(
"in.txt",
"r", stdin);freopen(
"out.txt",
"w", stdout);
#endifint n, m;
while (~
scanf(
"%d%d", &n, &m)) {a[
1] =
0;n++;
for (
int i =
2; i <= n; ++i) {
scanf(
"%d", &a[i]);}n++;a[n] = m;
for (
int i =
2; i <= n; i +=
2) {sum1[i] = sum1[i -
2] + a[i] - a[i -
1];sum1[i +
1] = sum1[i];}
for (
int i =
3; i <= n; i +=
2) {sum2[i] = sum2[i -
2] + a[i] - a[i -
1];sum2[i +
1] = sum2[i];}
int ans = sum1[n];
for (
int i =
1; i < n; ++i) {
if (i %
2) {
int t = a[i +
1] - a[i] -
1 + sum1[i] + sum2[n] - sum2[i +
1];ans = ans > t ? ans : t;}
else {
int t = a[i +
1] - a[i] -
1 + sum1[i] + sum2[n] -sum2[i +
1];ans = ans > t ? ans : t;}}
printf(
"%d\n", ans);}
#ifndef ONLINE_JUDGEfclose(stdin);fclose(stdout);system(
"out.txt");
#endif return 0;
}
總結
以上是生活随笔為你收集整理的B. Light It Up的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。