The Longest Straight FZU - 2216(模拟或二分)

原创 2018年04月15日 17:55:52

E - The Longest Straight

题目链接: FZU - 2216
题意:n张纸牌, 数字0可以变成任意数字, 纸牌上最大数不能大于m;求n张纸牌中连续的最长的纸牌序列长度(可以使用数字为0的纸牌);
思路:比赛的时候直接模拟 ,用有数字0的纸牌将不连续的连起来, 最长能连几张;然后一直滚动;
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <queue>
using namespace std;
const int maxn=1e5+10;
int vis[maxn], cnt[maxn];
int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		int x, n, m;
		scanf("%d%d", &n, &m);
		int zero=0;
		memset(cnt, 0, sizeof(cnt));
		memset(vis, 0, sizeof(vis));
		for(int i=0; i<n; i++){
			scanf("%d", &x);
			if(x==0) zero++;
			vis[x]=1;
		}
		queue<int> q;
		int ans=0, num=0, l, r;
		l=0, r=0;
		for(int i=1; i<=m; i++){
			if(!vis[i]&&num<zero){//如果有零未用, 用零代替i;左区间不变, 右区间右移;将该零的位置放入queue;
				q.push(i);
				r++;
				num++;			
			}
			else if(!vis[i]){//如果零用完了, 讲第一个零拿过来代替i;左区间移动到之前第一个零的位置;
				q.push(i);
				l=q.front();
				q.pop();
				r++;
			}
			else{
				r++;
			}
			ans=max(r-l, ans);
		}
		printf("%d\n", ans);
	}
	return 0;
}
比赛结束后搜的博客, 发现竟然全是二分做的;
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <stdio.h>
using namespace std;
const int maxn=1e5+10;
int vis[maxn], cnt[maxn];
int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		int x, n, m;
		scanf("%d%d", &n, &m);
		int zero=0;
		memset(cnt, 0, sizeof(cnt));
		memset(vis, 0, sizeof(vis));
		for(int i=0; i<n; i++){
			scanf("%d", &x);
			if(x==0) zero++;
			vis[x]=1;
		}
		for(int i=1; i<=m; i++){
			if(!vis[i]) cnt[i]=cnt[i-1]+1;
			else cnt[i]=cnt[i-1];
		}
		int ans=0;
		for(int i=0; i<=m; i++){
			int left=i, right=m;
			while(left<=right){
				int mid=right-(right-left)/2;
				if(cnt[mid]-cnt[i]>zero) right=mid-1;
				else left=mid+1;
			}
			ans=max(ans, right-i);
		}
		printf("%d\n", ans);
	}
	return 0;
}




版权声明:欢迎大家指正错误,有不同观点的欢迎评论,共同进步 https://blog.csdn.net/Sirius_han/article/details/79950728

fzu 2216 The Longest Straight

Problem 2216 The Longest Straight Accept: 178    Submit: 536 Time Limit: 1000 mSec    Memory Limit :...
  • qq1059752567
  • qq1059752567
  • 2016-04-24 21:09:53
  • 395

FZU 2216 The Longest Straight 枚举+二分

FZU 2216 The Longest Straight 枚举+二分
  • qq_26071477
  • qq_26071477
  • 2016-08-20 18:29:40
  • 317

FZU 2216 The Longest Straight (二分)

Problem 2216 The Longest Straight Accept: 128    Submit: 369 Time Limit: 1000 mSec    Memory Lim...
  • L_BestCoder
  • L_BestCoder
  • 2016-04-03 17:37:11
  • 329

FZU Problem 2216 The Longest Straight(二分答案+树状数组)——第六届福建省大学生程序设计竞赛-重现赛

FZU Problem 2216 The Longest Straight(二分答案+树状数组)——第六届福建省大学生程序设计竞赛-重现赛...
  • queuelovestack
  • queuelovestack
  • 2016-09-08 16:36:18
  • 416

FZU 2216 The Longest Straight (二分)

FZU 2216 The Longest Straight (二分)
  • Tc_To_Top
  • Tc_To_Top
  • 2016-08-20 19:42:02
  • 346

fzu 2216 The Longest Straight 二分

题目链接http://acm.fzu.edu.cn/problem.php?pid=2216题意给出n张牌,每张牌有个数值,n张牌中最大的值为m。值为0的牌可以代替任意值,问可以凑出最长顺子的长度是多...
  • chen_minghui
  • chen_minghui
  • 2017-10-06 13:31:36
  • 54

FZU2216 The Longest Straight

题目链接:https://www.nitacm.com/problem_show.php?pid=10964题解:题目大意: 给你n张牌,这些牌的大小从0到m,0牌是万能牌,可以用它变成任何的牌,问...
  • silver_bone
  • silver_bone
  • 2017-02-26 20:15:11
  • 105

The Longest Straight FZU - 2216

The Longest Straight FZU - 2216题意有n张卡片,每个卡片代表了从1到M的一个数字(可能重复), 这n个卡片中还可能有零,可以用来代表任何从1到M的数字,求最长的连续序列是...
  • weixin_38686780
  • weixin_38686780
  • 2017-08-26 17:22:17
  • 62

FZU 2216 The Longest Straight (二分+01优化)

Problem 2216 The Longest Straight Accept: 446    Submit: 1394 Time Limit: 1000 mSec    Memory Li...
  • sizaif
  • sizaif
  • 2017-11-20 19:16:30
  • 81
收藏助手
不良信息举报
您举报文章:The Longest Straight FZU - 2216(模拟或二分)
举报原因:
原因补充:

(最多只允许输入30个字)