FZU - 2216 The Longest Straight(二分枚举或队列)

原创 2018年04月15日 20:35:00

题意:有n张牌,最大为m,其中0能充当1-m的任意牌,求顺子的最大长度

思路:这道题开始我是用了一个队列维护顺子,从1到m开始枚举,如果这张牌存在的话,直接push进去,如果不存在的话,我们也push进去,但0的个数我们要减去1,如果此时0的个数为0的话,我们开始pop,直到pop出一个需要用0来代替的数。此过程队列的最大长度就是答案。

看了题解后发现二分也能做

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <queue>

using namespace std;

const int maxn = 100005;
int vis[maxn];

int main(void){
	int t;
    scanf("%d",&t);
    
	while(t--){
		int n,m;
		scanf("%d%d",&n,&m);
		memset(vis,0,sizeof(vis));
		int cnt0 = 0;
		for(int i = 1; i <= n; i++){
			int id;
			scanf("%d",&id);
			if(id == 0){
				cnt0++;
			}
			else{
				vis[id] = 1;
			}
		}
		queue<int> q;
		int ans = 1;
		for(int i = 1; i <= m; i++){
			if(vis[i]){
				q.push(i);
				int ll = q.size();
				ans = max(ans,ll);
			}
			else{
				if(cnt0 > 0){
					q.push(i);
					int ll = q.size();
				    ans = max(ans,ll); 
					cnt0--;
				}
		        else{
		        	while(!q.empty()){
		        		int temp = q.front();
		        		if(vis[temp] == 0){
		        			cnt0++;
		        			q.pop();
		        			break;
						}
						q.pop();
					}
					if(cnt0 > 0){
					    q.push(i);
					    int ll = q.size();
				        ans = max(ans,ll); 
					    cnt0--;
				    }
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

二分做法

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>

using namespace std;

const int maxn = 100005;
int vis[maxn];
int num[maxn];

int main(void){
	int t;
    scanf("%d",&t);
    
	while(t--){
		int n,m;
		scanf("%d%d",&n,&m);
		memset(vis,0,sizeof(vis));
		memset(num,0,sizeof(num));
		int cnt0 = 0;
		for(int i = 1; i <= n; i++){
			int id;
			scanf("%d",&id);
			
			if(id == 0){
				cnt0++;
			}
			else{
				vis[id] = 1;
			}
		}
		
		num[0] = 0;
		for(int i = 1; i <= m; i++){
			num[i] = num[i - 1] + !vis[i];
		}
		int ans = 1;
		for(int i = 0; i <= m; i++){
			int l = i,r = m,mid;
			while(l <= r){
				mid = (l + r) / 2;
				if(num[mid] - num[i] > cnt0){
					r = mid - 1;
				}
				else{
					l = mid + 1;
				}
			}
			ans = max(ans,r - i);
		}
		printf("%d\n",ans);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GYH0730/article/details/79952785

FZU 2216 The Longest Straight 枚举+二分

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

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
  • 391

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

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

E - The Longest Straight ...
  • Sirius_han
  • Sirius_han
  • 2018-04-15 17:55:52
  • 4

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
  • 104

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
收藏助手
不良信息举报
您举报文章:FZU - 2216 The Longest Straight(二分枚举或队列)
举报原因:
原因补充:

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