https://codeforces.com/problemset/problem/1000/B

题意:

一个模拟思维题。就是有一盏灯,0时刻开着。n次操作,你可以在其中加入一次操作(或者不加),操作为:a[i]时刻按一下开关,状态变为相反状态(开->关or关->开)。问灯亮着的时长最长为多少?

样例一0~4开(时长为4-0),4~6关(时长为6-4),6~7开(时长为7-6),7~10关(时长为10-7),可以这这些时间点中加操作使开灯时间变长 在3处加操作,开灯时长变为0~3(开)3~4(关)4~6(开)6~7(关)7~10(开)

给定n个数,和上界m,即在0到m个区间内插入n个数,形成n+1个区间,区间长度提取出来单独成一个序列。
可以选择其中至多一个数分裂,(x=y+z),求分裂后的奇数序和(tim[1]+tim[3]+....)问最大化是多少。
注意在拆分是,n如果要拆,肯定是拆成了1和n-1(n本身为1可以略过),n-1为开灯时间

思路:

预处理加贪心

代码如下:

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
#define Bug cout<<"---------------------"<<endl
const int maxn=1e5+;
using namespace std; int A[maxn];//原数组
int p[maxn];//差分数组求差值
int sum[];//辅助数组
int bhd_sum[maxn];//从后往前到i处的奇偶项之和
int fot_sum[maxn];//从前往后到i处的奇偶项之和 int main()
{
int n,m;
scanf("%d %d",&n,&m);
A[] = ;
int flag = ;
for(int i = ;i <= n;i++)
{
scanf("%d",&A[i]);
p[i] = A[i] - A[i-];
fot_sum[i] = fot_sum[i-] + flag*p[i];
flag = !flag;
}
A[n+] = m;
p[n+] = A[n+]-A[n];
fot_sum[n+] = fot_sum[n] + flag*p[n];
int cnt = ;
for(int i = n+;i > ;i--)
{
sum[cnt%] += p[i];
bhd_sum[i] = sum[cnt%];
cnt++;
}
int ans = bhd_sum[];
for(int i = ;i <= n+;i++)
{
ans = max(ans,fot_sum[i]- + bhd_sum[i+]);
}
printf("%d\n",ans);
}

别人写的代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
#define N 1000005 int n,m,a[N],l[N],ans=; int main()
{
cin>>n>>m;
bool flag=; //开关
l[]=;a[]=;
for(int i=;i<=n;i++)
{
cin>>a[i];
l[i]=l[i-]+flag*(a[i]-a[i-]);
flag=!flag; //感觉超级巧妙
}
l[n+]=l[n]+flag*(m-a[n]);//不加操作时的总时长
ans=l[n+];
for(int i=;i<=n;i++)
{
ans=max(ans,l[i]+m-a[i]-(l[n+]-l[i])-); //相通之后太巧妙了啊!!
/*m-a[i]是在这个点改变之后所有时长
l[n+1]-l[i] 原来总开灯时长-这点之前开灯时长=这点之后开灯时长。而改变这个点后。后面所有开灯时长变成了关灯时长
m-a[i]-(l[n+1]-l[i])也就是这个点 这个点改变之后所有时长- 关灯时长 =开灯时长
还要-1,因为 都是在点的临近点操作*/
}
cout<<ans<<endl;
}

CodeForces 1000B Light It Up(贪心、思维)的更多相关文章

  1. codeforces 233 C. Cycles(贪心+思维)

    题目链接:http://codeforces.com/contest/233/problem/C 题意:在一个无相图中有N个长度为3 的回路,输出符合条件的图.注意此图的节点数不得超过100 题解:贪 ...

  2. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  3. 贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas

    题目传送门 /* 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0 ...

  4. Mike and distribution CodeForces - 798D (贪心+思维)

    题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...

  5. [Codeforces 1214A]Optimal Currency Exchange(贪心)

    [Codeforces 1214A]Optimal Currency Exchange(贪心) 题面 题面较长,略 分析 这个A题稍微有点思维难度,比赛的时候被孙了一下 贪心的思路是,我们换面值越小的 ...

  6. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

  7. 贪心/思维题 UVA 11292 The Dragon of Loowater

    题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...

  8. T - Posterized(贪心思维)

    Description Professor Ibrahim has prepared the final homework for his algorithm’s class. He asked hi ...

  9. codeforces 349B Color the Fence 贪心,思维

    1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1 ...

随机推荐

  1. Ubuntu 终端命令速查表

    1.man: shell命令的说明指南 该命令代表manual,提供一个给定命令的说明指南. 用法:man <shell command> 用例:man ls 上述命令请求命令‘ls’的说 ...

  2. Essay写作:Conclusion部分写作辅导

    论文写到最后,一般正文就要以Conclusion结束了.Conclusion部分是一篇论文的正文结尾(the last section of a paper,last paragraph),主要是客观 ...

  3. 十八、React react-router4.x中:实现路由模块化、以及嵌套路由父子组件传值

    一.路由模块化(用字典定义路由,然后循环出来) 1.官方文档参考 [官方文档]https://reacttraining.com/react-router/web/guides/quick-start ...

  4. Window Server 2019 配置篇(2)- 在window server core上安装网络跟DHCP服务

    上一篇我们已经建立了自己的域服务器 之后我们将安装一个window server core,也就是没有GUI只有命令行的window server,并在其上安装网络服务和DHCP 首先创建一个新的虚拟 ...

  5. 对状态字的理解 尤其是 首次检测位“/FC”的想法

    状态字 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0               BR CC1 CC0 OV OS OR STA RLO /FC 问题1 关于首次检测位& ...

  6. 精简总结redis/rabbitmq/zookeeper在linux centos7上的安装

    因为本博主之前已经写过了相关的一些安装及集群,可以参考前面的记录,但是由于博最近更换了VM14和centos7,为了适应这些环境,所以后续会逐渐重新搭建相关环境,并对之前的安装思路进一步精简梳理,以期 ...

  7. usb摄像头驱动的移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y 1.使用摄像头型号ov9650 ①修改.配置内核 1.修改vi drivers/i2c/busses/Kconfig (参 ...

  8. 解决:Server IPC version 9 cannot communicate with client version 4

    使用idea的maven项目运行mapreduce程序Server IPC version 9 cannot communicate with client version 4 原因: Java初始化 ...

  9. 3种python调用其他脚本的方法,你还知道其他的方法吗?

    1.用python调用python脚本 #!/usr/local/bin/python3.7 import time import os count = 0 str = ('python b.py') ...

  10. 关于TCP连接的3次握手和4次挥手

    3次握手: 关键在于双方都需要确认自己的发信和收信功能正常,收信功能通过接收对方信息得到确认,发信功能需要发出信息—>对方回复信息得到确认. 举个日常例子,打电话时我们对话如下: 如上,需要第三 ...