CF#FF(255)-div1-C【水题,枚举】
【吐槽】:本来没打算写这题的题解的,但惨不忍睹得WA了13次,想想还是记录一下吧。自己的“分类讨论能力”本来就很差。
刚开始第一眼扫过去以为是LIS,然后忽略了复杂度,果断TLE了,说起来也好惭愧,也说明有时候太懒得动脑了,总是习惯利用惯性思维,这不是一件好事。
【题意】:给你大小为n的整型数组a[n],求这数组的一个子串,其中最多可以修改子串中的一个数字,使得到的子串是最长的严格递增的子串,输出该子串的长度 L。
【思路】:O(n)复杂度,枚举断点情况。第0个和第n个位置默认为断点。(用ve[i]表示第 i 个断点在a[n]中的下标位置)
1、断点 ve[i] 可更改,即断点两端数的差值大于1时,L 为前一个断点到后一个断点的距离,即 L = ve[i+1]-ve[i-1]。
2、断点 ve[i] 不可更改,则这里又分两种情况:①由于从断点开始左右两侧分别是严格递增的,所以如果 a[ve[i]] - a[ve[i]-2] > 1,则表示 a[ve[i]-1] 可修改,
使得断点前后两段可以结合,L = ve[i+1]-ve[i-1]。
②如果不满足①的情况,则取 ve[i]-ve[i-1] 和 ve[i+1]-ve[i] 中的较大值。
下面是AC代码:
代码下是测试数据
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std; #define maxn 100006
int ant[maxn];
int main()
{
int n;
while(scanf("%d", &n) != EOF){
vector<int> ve; ve.push_back();
scanf("%d", &ant[]);
for(int i = ; i < n; i++){
scanf("%d", &ant[i]);
if(ant[i]-ant[i-] <= ) { ve.push_back(i);}
}
ant[n] = -;
ve.push_back(n); int l = ve.size();
int m, res = -; if(l > )
for(int i = ; i < l-; i++){
if(ant[ve[i]+] - ant[ve[i]-] > ){
m = ve[i+] - ve[i-];
}
else if(ve[i-] != ve[i]-){
if(ve[i] > &&ant[ve[i]]-ant[ve[i]-] > ) m = ve[i+]-ve[i-];
else if(ve[i]-ve[i-] > ve[i+]-ve[i]) m = ve[i]-ve[i-]+;
else m = ve[i+]-ve[i]+;
}
else { m = ve[i+]-ve[i-];} if(m > res) res = m;
}
else res = n; printf("%d\n", res);
}
}
/*
input:
11
7 2 6 4 3 1 8 10 24 31 25
6
7 2 3 1 5 6
9
1 3 3 4 4 5 5 6 6
5
1 3 2 5 4
11
7 2 6 4 3 3 8 10 24 31 25
10
1 3 2 2 4 6 9 3 7 2
50
804289384 846930887 681692778 714636916 957747794 424238336 719885387 649760493 596516650 189641422 25202363 350490028 783368691 102520060 44897764 967513927 365180541 540383427 304089173 303455737 35005212 521595369 294702568 726956430 336465783 861021531 59961394 89018457 101513930 125898168 131176230 145174068 233665124 278722863 315634023 369133070 468703136 628175012 635723059 653377374 656478043 801979803 859484422 914544920 608413785 756898538 734575199 973594325 149798316 38664371
10
424238336 649760493 681692778 714636916 719885387 804289384 846930887 957747794 596516650 189641422
10
1 2 3 4 5 5 6 7 8 9
5
1 1 1 1 1
5
1 1 2 3 4
6
7 2 3 1 4 5
4
1 4 3 4
5
0 1 4 3 4 output:
6
5
3
4
6
5
19
9
6
2
5
4
4
5
*/
CF#FF(255)-div1-C【水题,枚举】的更多相关文章
- 洛谷P2038 无线网络发射器选址 水题 枚举
刚开始边界写错了(将128写成127). 注意n <= 20,所以可以每读入一个点就将其周边更新,这样最多也只会有 40 * 40 * 20 种位置需要被枚举. Code: #include&l ...
- CF 277.5 A.SwapSort 水题
//STL教你做人系列 #include<stdio.h> #include<iostream> #include<math.h> #include<algo ...
- CF 593B Anton and Lines(水题)
题意是给你n条直线,和x1,x2;问 在x1,x2之间(不包括在x1,x2上) 存不存在任意两条线的交点. 说思路,其实很简单,因为给的直线的条数很多,所以无法暴力求每两条直线的交点,那么就求每条直线 ...
- CF 628B New Skateboard --- 水题
CD 628B 题目大意:给定一个数字(<=3*10^5),判断其能被4整除的连续子串有多少个 解题思路:注意一个整除4的性质: 若bc能被4整除,则a1a2a3a4...anbc也一定能被4整 ...
- CF 628A --- Tennis Tournament --- 水题
CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m & ...
- poj1873 The Fortified Forest 凸包+枚举 水题
/* poj1873 The Fortified Forest 凸包+枚举 水题 用小树林的木头给小树林围一个围墙 每棵树都有价值 求消耗价值最低的做法,输出被砍伐的树的编号和剩余的木料 若砍伐价值相 ...
- 一道cf水题再加两道紫薯题的感悟
. 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. . 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整 ...
- 做了一道cf水题
被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...
- CF451C Predict Outcome of the Game 水题
Codeforces Round #258 (Div. 2) Predict Outcome of the Game C. Predict Outcome of the Game time limit ...
随机推荐
- Leetcode#140 Word Break II
原题地址 动态规划题 令s[i..j]表示下标从i到j的子串,它的所有分割情况用words[i]表示 假设s[0..i]的所有分割情况words[i]已知.则s[0..i+1]的分割情况words[i ...
- livevent的几个问题
关于libevent的几个问题 1.他到底是如何保证这个套接字有效的 主线程去断开关闭套接字,主线程去调用buffwrite,在子线程收到客户端断开时,主线程延迟1分钟释放,这样保证子线程操作完该so ...
- 如何混合使用ARC和非ARC
如果你的项目使用的非ARC模式,则为ARC模式的代码文件加入-fobjc-arc标签.如果你的项目使用的ARC模式,则为非ARC模式的代码文件加入 -fno-objc-arc标签.添加标签的方法: 1 ...
- (转)xmpp 环境配置-支持扩展
第一种方法直接拖 1> 拖入文件夹 在网盘链接的xmppFramework文件夹 :http://pan.baidu.com/s/1jGxLa3G 也可以直接去github搜索下载. 2> ...
- 作品展示,JavaScript 版水果忍者
点这里 <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 R ...
- Android线程消息通信(一)
Android在Java标准线程模型的基础上,提供了消息驱动机制,用于多线程之间的通信.基于消息驱动机制的线程通信模型陈伟线程消息通信.在标准线程模型中,线程执行完毕后便退出,而Android扩展了线 ...
- 如何在Windows7(IIS7)环境下安装 PHP
一.安装IIS7 打开(1)[程序和功能],然后点击(2)[打开或关闭Windows功能] 勾选(1)[IIS管理控制台]和(2)CGI,然后点击[确定]按钮,等待安装完成.这个过程可能需要系统安装光 ...
- ExtJs之Ext.util.TaskRunner
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- MongoDB (一) MongoDB 介绍
MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoDB工作在收集和文件的概念. 数据库 数据库是一个物理容器集合.每个数据库都有自己的一套文件系统上的文 ...
- 李洪强iOS开发之UICollectionView的使用
想做如下的界面效果(纯代码) ------------------------------------------------------------------------------------ ...