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 ...
随机推荐
- 【LCA】CodeForce #326 Div.2 E:Duff in the Army
C. Duff in the Army Recently Duff has been a soldier in the army. Malek is her commander. Their coun ...
- 【BZOJ】【1045/1465】【HAOI2008】糖果传递
思路题/神奇的转化…… orz hzwer 或许这个思路可以从单行而非环形的递推中找到?(单行的时候,从左往右直接递推即可…… 感觉好神奇>_<脑残患者想不出…… P.S.话说在$n\le ...
- Java获取项目中的路径 分类: Java Game 2014-08-14 10:17 122人阅读 评论(0) 收藏
在项目中经常需要获取某个文件的路径: 在这里提供一些获取路径的方法.. 1.此种方式获取的路径,是当前类所在的路径: UserDAOTest.class.getResource("UserD ...
- UML快速指南(摘要)转载
UML 概述: UML是一个通用的建模语言.它最初开始捕捉到复杂的软件和非软件系统的行为,现在它已经成为一个OMG标准. UML提供元素和组件的复杂系统支持的要求. UML遵循面向对象的概念和方法.因 ...
- 各大Oj平台介绍
1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...
- Shell 备忘录
此文收集工作中用到的Shell备忘,随用随机: 1.比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如 ...
- 如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?(2)
[编者按]本篇文章作者是 Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客.本篇文章中,作者主要介绍了如何基于 Parse 特点,打造一款类似 Instagr ...
- winform中的时间轴控件
我现在做的项目遇到一个需求,就是有没有类似的控件: 我要实现的功能是:播放录像. 某个时间段内假如有2个录像,这个坐标表示的是时间,假如我现在拖动时间轴,拖到第一个录像里面开始播放第一个录像,拖到2个 ...
- POJ 1631
#include <iostream> #define MAXN 500005 using namespace std; int T[MAXN]; int binary_search(in ...
- POJ 1552
#include<iostream> using namespace std; int main() { ]; int i,j; ; do{ sum=; ;num[i-]!=&&a ...