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. 如何将dmp文件导入到Oracle

    一.概述 在将dmp文件导入到Oracle中之前,需要先创建一个orcale用户.然后使用该用户名和密码,以imp的方式将数据导入到oracle中. 二.执行步骤 1.登陆oracle数据库 a.sq ...

  2. Live555研究之一 源代码编译

    Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化 ...

  3. 【ABP】从零开始学习ABP_入门介绍

    本文介绍自己入坑ABP的过程,一些ABP的相关文章.QQ群,以及ABP Zero示例项目的运行. 背景 作为一个半路出家学习编程的新人,之前工作中也断断续续写过一些代码,但底层核心一直没机会学习,所以 ...

  4. Spring Boot2(004):关于 Build Systems (构建系统)

    Spring Boot Ref 建议使用 maven 或者 gradle 来进行依赖管理和应用构建. 一.Dependency Management(依赖管理) Spring Boot 的每个版本都会 ...

  5. CNN经典模型VGG

    VGG是一个很经典的CNN模型,接触深度学习的人大概都有所耳闻.VGG在2014年被提出并拿来参加ImageNet挑战赛,最终实现了92.3%的正确率,得到了当年的亚军.虽然多年过去,又有很多新模型被 ...

  6. 10.swoole学习笔记--进程队列通信

    <?php //进程仓库 $workers=[]; //最大进程数 $worker_num=; //批量创建进程 ;$i<$worker_num;$i++){ //创建子进程 $proce ...

  7. python中添加requests资源包

    1.进入资源网址下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 2.按下CTRL+F进行页面查找“requests” 3.点击requests-2.22. ...

  8. 065-PHP函数中声明全局变量

    <?php function test(){ //定义函数 global $a; //声明全局变量 $a=7; echo "函数内: ".$a . "<br& ...

  9. redis在.Net程序中使用

    1.设置访问密码 config 2.连接redis服务器 private static string redisHost = ConfigHelper.GetAppSetting("redi ...

  10. postgrepSQL数据库创建二级分区表

    数据库版本:version 10 以非继承的形式创建分区表,一级分区是城市,二级分区是天:指定分区有两种形式,RANGE和LIST,如果使用RANGE在创建分区语句中是通过FOR VALUES FRO ...