The Longest Straight(FZU2216)
2016-04-18 18:16
435 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2216
题目意思是给出一列数字串,然后0是万能。求某一段能构成连续数列的串最长的长度。如3 5 0 1 2 9 9 9 9 9那么就是3 5 0(替换成4) 1 2最长的长度是5
思路是离散化加二分,离散化就是把数字理解成出现或者未出现,然后未出现的用万能的0补上,看看最长能补出最长的串是多少
题目意思是给出一列数字串,然后0是万能。求某一段能构成连续数列的串最长的长度。如3 5 0 1 2 9 9 9 9 9那么就是3 5 0(替换成4) 1 2最长的长度是5
思路是离散化加二分,离散化就是把数字理解成出现或者未出现,然后未出现的用万能的0补上,看看最长能补出最长的串是多少
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int t,n,m; int flag[100005],cnt[100005]; //flag标记是否出现,cnt标记当前位置的连续串长度 int main() { scanf("%d",&t); while(t--) { cin>>n>>m; memset(flag,0,sizeof(flag)); memset(cnt,0,sizeof(cnt)); int zero=0; for(int i=0; i<n; i++) { int a; scanf("%d",&a); //一开始用cin超时了 if(a) flag[a]=1;//标记 else zero++;//统计0 } cnt[0]=0;//第0个位置置为0 for(int i=1; i<=m; i++)//统计的是现有的已经形成连续串的长度 { if(flag[i]) cnt[i]=cnt[i-1]; else cnt[i]=cnt[i-1]+1; } int ans=0; for(int i=0; i<=m; i++)//枚举所有起始位置 { int l=i,r=m,mid; while(l<=r)//每次都二分答案 { mid=(l+r)/2; if(cnt[mid]-cnt[i]>zero) r=mid-1; else l=mid+1; } ans=max(ans,r-i); } printf("%d\n",ans); } return 0; }
相关文章推荐
- saiku执行速度优化二
- UltraISO制作启动盘及提取U盘为ISO镜像
- shrio 权限管理filterChainDefinitions过滤器配置
- 切图教程,PS和AI切图方法分享
- error LNK2005: _DllMain@12 already defined 错误解决方案
- 人工智能60年:图灵的在天之灵,安息吧!
- 【翻译】GCJ 2008 APAC local onsites C Millionaire 题解
- main()函数的两个参数
- Implicit & Explicit Waits in Selenium
- Conversion to Dalvik format failed with error 1
- explain分析查询
- Map.containsKey(String key)
- tail -f 不好用? 用法小解析
- 人工智能60年:人工智能音乐即将问世
- 17、责任链模式(ChainofResponsibility)
- 错误:HTTP load failed (kCFStreamErrorDomainSSL, -9813)/Error Domain=NSURLErrorDomain Code=-1202
- 关于curl: (2) Failed Initialization
- XP系统通过Twain扫描提示成像设备无法初始化的解决方法
- 关于iBaits的使用
- http://blog.csdn.net/jiangwei0910410003/article/details/41620363