FZU 2216 The Longest Straight(最长直道)
|
Description |
题目描述 |
|
ZB is playing a card game where the goal is to make straights. Each card in the deck has a number between 1 and M(including 1 and M). A straight is a sequence of cards with consecutive values. Values do not wrap around, so 1 does not come after M. In addition to regular cards, the deck also contains jokers. Each joker can be used as any valid number (between 1 and M, including 1 and M). You will be given N integers card[1] .. card[n] referring to the cards in your hand. Jokers are represented by zeros, and other cards are represented by their values. ZB wants to know the number of cards in the longest straight that can be formed using one or more cards from his hand. |
ZB正在玩一个纸牌游戏叫做造直道。这幅卡组中的每张卡都有一个1到M间的数字(包括1与M)。一条直道是连续的卡牌序列。值不能循环,因此1不能在M后面。注意除了基本牌外,卡组里还有大小王。每张王可以当成任意一个有效数字(1到M,包括1与M)。 给你N个整数card[1] .. card[n]表示你的手牌。大小王由0表示,其他牌由他们的值表示。ZB想知道自己手牌可以造出的直道最大长度是多少。 |
|
Input |
输入 |
|
The first line contains an integer T, meaning the number of the cases. For each test case: The first line there are two integers N and M in the first line (1 <= N, M <= 100000), and the second line contains N integers card[i] (0 <= card[i] <= M). |
输入的首行是一个整数T,表示测试样例的数量。 对于每个测试样例: 第一行有2个整数N和M(1 <= N, M <= 100000),并且第二行有N个整数card[i] (0 <= card[i] <= M)。 |
|
Output |
输出 |
|
For each test case, output a single integer in a line -- the longest straight ZB can get. |
对于每个测试样例,输出一行一个整数——ZB可以得到的最大直道长度。 |
|
Sample Input - 输入样例 |
Sample Output - 输出样例 |
|
2 7 11 0 6 5 3 0 10 11 8 1000 100 100 100 101 100 99 97 103 |
5 3 |
【题解】
从数据来看,时间复杂度O(N2)必定爆炸(反正我没优化出来……),请使用O(Nlog2N)。
因此推测出算法,确定左端点(N),二分查(log2N)找在鬼牌允许使用范围内的右端点。
记录当前点前面有多少个0(空缺),然后两端一减就得到需要几张鬼牌填充了。
【代码 C++】
空间比较任性,速度还能优化……
#include<cstdio>
#include<cstring>
int data[], sot[];
int length(int L, int R, int i0){//[ L, R]
if (L == R){
if (sot[L] || i0) return ;
return ;
}
int mid = L + R >> ;
if (data[mid] - data[L - ] > i0) return length(L, mid, i0);
return mid - L + + length(mid + , R, i0 - (data[mid] - data[L - ]));
}
int main(){
int T, N, M, i, j, opt;
scanf("%d", &T);
while (T--){
memset(sot, , sizeof(sot));
scanf("%d%d", &N, &M);
for (data[] = i = ; i < N; ++i) scanf("%d", &j), ++sot[j];
for (i = ; i <= M; ++i){
if (sot[i]) data[i] = data[i - ];
else data[i] = data[i - ] + ;
}
for (opt = i = ; i <= M; ++i){
j = length(i, M, sot[]);
if (j>opt) opt = j;
}
printf("%d\n", opt);
}
return ;
}
FZU 2216
FZU 2216 The Longest Straight(最长直道)的更多相关文章
- FZU 2216——The Longest Straight——————【二分、枚举】
Problem 2216 The Longest Straight Accept: 17 Submit: 39Time Limit: 1000 mSec Memory Limit : 32 ...
- FZU 2216 The Longest Straight 模拟
题目链接:The Longest Straight 就是一个模拟就是这样,T_T然而当时恶心的敲了好久,敲完就WA了,竟然有这么简单的方法,真是感动哭了.......xintengziji...zhi ...
- FZU 2216 The Longest Straight 二分
0可以表示任何1到m的数,求一个最长的连续上升序列长度 因为m的范围在10w,所以以每个节点为起点 进行二分,复杂度mlogm 思路:b[i]表示到 1 到 i 有几个数没有出现,二分的时候注意加等号 ...
- The Longest Straight(二分,离散化)
Problem 2216 The Longest Straight Accept: 7 Submit: 14 Time Limit: 1000 mSec Memory Limit : 3 ...
- FZU-2216 The Longest Straight(尺取法)
Problem 2216 The Longest Straight Accept: 523 Submit: 1663Time Limit: 1000 mSec Memory Limit ...
- The Longest Straight(FZUoj2216)
Problem 2216 The Longest Straight Accept: 82 Submit: 203Time Limit: 1000 mSec Memory Limit : ...
- 福建省赛--Problem E The Longest Straight(标记+二分)
Problem E The Longest Straight Accept: 71 Submit: 293 Time Limit: 1000 mSec Memory Limit : 327 ...
- leetcode 5 Longest Palindromic Substring--最长回文字符串
问题描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- [LeetCode] Longest Palindrome 最长回文串
Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...
随机推荐
- JAVA NIO复习笔记
1. JAVA NIO是什么? 从JDK1.4开始,java提供了一系列改进的输入/输出处理的新功能,这些功能被统称为新IO(New IO,简称NIO),新增了许多用于处理输入/输出的类,这些类都被放 ...
- 鸟哥的Linux私房菜之学习shell script
运行程序的时候一般都是创建一个子程序来执行,所以子程序中的变量什么的在当前的shell下没法使用,但是如果使用source来执行就可以在当前shell下执行程序 shift 1 去掉第一个参数,后面接 ...
- python时间处理函数
所有日期.时间的api都在datetime模块内. 1. 日期输出格式化 datetime => string import datetime now = datetime.datetime.n ...
- sql如何将同个字段不同值打印在一行
group_concat(distinct(img)) group by id通过id分组把img的值打印在一行group_concat()通常和group by一起使用,功能是把某个字段的值打印在一 ...
- linux文件所属用户和组
使用chown命令可以修改文件或目录所属的用户: 命令:chown 用户 目录或文件名 例如:chown -R qq /home/qq (把home目录下的qq目录的拥有者改为qq用户) 使用chg ...
- json校验
直接百度:json在线解析 或 json.cnhttp://json.cn/ json格式校验的.这个更加简洁些.
- 【python cookbook】【字符串与文本】4.文本模式的匹配和查找
问题:按照特定的文本模式进行匹配或查找 解决方法: 1.简单的文字匹配,只需使用str.find().str.startswith().str.endswith()或类似的函数即可: 2.复杂的匹配, ...
- scala匿名函数
package com.ming.test import scala.math._ object AnonymousFunc { def valueAtOneQuarter(f:(Double)=&g ...
- 电影TS、TC、SCR、R5、BD、HD等版本是什么意思
在很多电影下载网站的影片标题中我们都能看到,比如<刺杀希特勒BD版>.<游龙戏凤TS版>等,这些英文缩写都是什么意思呢?都代表什么画质?以下就是各个版本的具体含义: 1.CAM ...
- 第十一章 Android 内核驱动——Alarm
11.1 基本原理 Alarm 闹钟是 android 系统中在标准 RTC 驱动上开发的一个新的驱动,提供了一个定时器 用于把设备从睡眠状态唤醒,当然因为它是依赖 RTC 驱动的,所以它同时还可以 ...