The Longest Straight FZU
来源:互联网 发布:2018年禁止网络直播 编辑:程序博客网 时间:2024/06/06 00:25
The Longest Straight FZU - 2216
二分求解
题意
有n张卡片,每个卡片代表了从1到M的一个数字(可能重复), 这n个卡片中还可能有零,可以用来代表任何从1到M的数字,求最长的连续序列是多少
分析
1 先建立数组, 若在i的位置有一个卡片, 则标记为真,
2 然后用sum数组记录从1到i总共有多少个空缺,
3 再用一个left数组记录每一段已经有卡片的最左边的数字,
4 然后对于每一个left,从left[i] 到 M 二分求最大值, 即求从left[i]开始的最长序列是多少(需要增加一个1,因为可能从1开始)
参考代码
const int LEN = 123456;int sum[LEN];int ar[LEN];int Left[LEN];int maxlen;int N,M;void check(int x,int zero)//从x到M的最长序列是多少{ if(!ar[x]) zero--; // if(x+zero>=M) // { //maxlen = max(maxlen,M-x+1); // return ; // } int spaces = sum[M]-sum[x]; if(zero>=spaces)////如果从x到M的空缺数量小于0卡片的数量, //最长序列就是M-x+1 { maxlen = max(maxlen,M-x+1); return ; } int l = x,r = M;//否则进行二分操作 while(r-l>1) { int mid = l+(r-l)/2; if(sum[mid]-sum[x]==zero) l = mid; else if(sum[mid]-sum[x]>zero) r = mid-1; else if(sum[mid]-sum[x]<zero) l = mid+1; } if(sum[r]-sum[x]==zero) maxlen = max(maxlen,r-x+1); else maxlen = max(maxlen,l-x+1);}int main(void){ int T; cin>>T; while(T--) { maxlen = 0; me(ar); me(sum); me(Left); cin>>N>>M; int Zero = 0; while(N--) { int a; scanf("%d",&a); if(a==0) ++Zero; else ar[a] = 1; } ar[0] = 1; bool sign = false; int num = 1; for(int i = 1; i <= M; ++i) { sum[i] = sum[i-1] + !ar[i]; if(!sign&&ar[i]) { Left[num++] = i; sign = true; } if(sign&&!ar[i]) sign=false; } check(1,Zero);//可能从1开始 for(int i = 1; i < num; ++i) { check(Left[i],Zero); } cout<<maxlen<<endl; } return 0;}
阅读全文
0 0
- The Longest Straight FZU
- fzu 2216 The Longest Straight
- fzu 2216 The Longest Straight
- FZU 2216 The Longest Straight (二分)
- FZU 2216 The Longest Straight 枚举+二分
- FZU 2216 The Longest Straight (二分)
- fzu 2216 The Longest Straight 二分
- FZU 2216 The Longest Straight (二分+01优化)
- The Longest Straight
- FZU2216 The Longest Straight
- The Longest Straight(FZU2216)
- FZU_2216 The Longest Straight (二分)
- FZU Problem 2216 The Longest Straight(二分答案+树状数组)——第六届福建省大学生程序设计竞赛-重现赛
- Fzuoj 2216 The Longest Straight 【二分 || 模拟】
- FOJ Problem 2216 The Longest Straight
- 2015福建省赛 fzoj The Longest Straight
- 2014 ACM 吉林省赛 A 题 The Longest Straight
- 福建省赛--Problem E The Longest Straight(标记+二分)
- RGB颜色对照表(全)
- 每个商家都能用得起的客流统计系统,中科每时每客助力线下零售
- 基于实体分析的数据仓库构建方法
- java/android 23种设计模式简单描述与示例(设计模式)
- ajax轮询实用例子之动态更新消息
- The Longest Straight FZU
- 关于输入的几种总结
- JS每周读书笔记[2]--Object & Array
- 从0开始架构一个IOS程序—— 02 — 设置启动图标与启动页面
- easyUI动态加载时崩溃
- Unity17--鼠标点击物体跟着移动、分层点击移动、铰链(关节)、布料
- 在无序数组中找第k大的数字—滴滴笔试
- Linux驱动中读写文件
- Android Toolbar使用