盘子序列

盘子序列

 【题目描述】

 有 n 个盘子。盘子被生产出来后,被按照某种顺序摞在一起。初始盘堆中如果一

 个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的。称初始盘堆为

 A,另外有一个开始为空的盘堆 B。为了掩盖失误,生产商会对盘子序列做一些“处

 理”,每次进行以下操作中的一个:(1)将 A 最上面的盘子放到 B 最上面;(2)将 B 最上

 面的盘子给你。在得到所有 n 个盘子之后,你需要判断初始盘堆里是否有危险的盘子。

 【输入格式】

 输入文件包含多组数据(不超过 10 组)

 每组数据的第一行为一个整数 n

 接下来 n 个整数,第 i 个整数表示你收到的第 i 个盘子的大小

 【输出格式】

 对于每组数据,如果存在危险的盘子,输出”J”,否则输出”Y”

 【样例输入】

 3

 2 1 3

 3

 3 1 2

 【样例输出】

 Y

 J

 【数据范围】

 20%的数据保证 n<=8

 80%的数据保证 n<=1,000

 100%的数据保证 1<=n<=100,000,0<盘子大小<1,000,000,000 且互不相等

思想:哀家发现,将数据到过来以后,只要出现这样的序列x,y,z(y<x且z>x),那么就不合法;同样的,只要不出现,就合法。

所以哀家就把数据循环判断了一下,一旦不符合就输出,结束。

然而20%的数据爆掉了(超时,没办法╮(╯▽╰)╭)。

哀家也有100分的做法,见底。

程序:program aa;

var a:array[1..100000]of longint;

s:string;

n,i,c:longint;

procedure pd;

var i,j,k:longint;

begin
for i:=1 to n do
begin
j:=i;
repeat
inc(j);
until (a[j]<a[i]) or (j=n);
if j=n then continue
else
for k:=j+1 to n do
if a[k]>a[i] then
begin
writeln(‘J‘);
exit;
end;
end;
writeln(‘Y‘);
end;

procedure open;
begin
assign(input,‘disk.in‘);
assign(output,‘disk.out‘);
reset(input);
rewrite(output);
end;

procedure closs;
begin
close(input);
close(output);
end;

begin
open;
while eof=false do//针对该题目的测试数据(eof原来这样用的!~\(≧▽≦)/~)
begin
readln(n);
for i:=n downto 1 do read(a[i]);
if n<>0 then
pd;
end;
closs;
end.

一点反思:足足测了3次才测到80分……

第一次:未将序列倒过来。

第二次:continue写成了break;导致:选手输出比标准输出短……

第三次:就是那个while n<>0……

100分做法:(不是哀家自己写的)

program disk;
var
a,b,z:array[0..100001] of longint;
i,j,k,n,t,now,flag,h:longint;
num:array[0..1] of longint;
procedure sort(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do
inc(i);
while x<a[j] do
dec(j);
if not(i>j) then
begin
y:=a[i];
a[i]:=a[j];
a[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort(l,j);
if i<r then
sort(i,r);
end;

function cz:longint;
var l,r,mid:longint;
begin
l:=1; r:=n+1;

while l<r do
begin
mid:=(l+r) div 2;
if a[mid]=b[i] then exit(mid);
if a[mid]>b[i] then r:=mid
else l:=mid+1;
end;
end;

procedure open;
begin
assign(input,‘disk.in‘);
assign(output,‘disk.out‘);
reset(input);
rewrite(output);
end;

procedure closs;
begin
close(input);
close(output);
end;

begin
// open;
while not eof do
begin
read(n);
flag:=0;
h:=0;
for i:=1 to n do
begin
read(b[i]);
a[i]:=b[i];
end;
sort(1,n);
for i:=1 to n do
b[i]:=cz();
now:=0;
for i:=1 to n do
begin
while now<b[i] do
begin
inc(h);
inc(now);
z[h]:=now;

end;
if b[i]=z[h] then
begin
dec(h);
continue;
end;
if b[i]<now then
if z[h]=b[i] then
dec(h)
else
begin
writeln(‘J‘);
flag:=1;
break;
end;

end;
if flag=0 then
writeln(‘Y‘);
end;
closs;
end.

时间: 2024-12-11 19:37:56

盘子序列的相关文章

20170803

今天早上依旧兴奋地考了一早上,一位AK了,但是分数出来让人失望,第三题着实打错了. 第一题是一道简单的题目,我用了,并查集和离散化. 盘子序列 (disk.cpp/c/pas) [问题描述] 有n个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的.称初始盘堆为A,另外有一个开始为空的盘堆B.为了掩盖失误,生产商会对盘子序列做一些"处理",每次进行以下操作中的一个:(1)将A最上面的盘子放到B最上面:(2)将B最

6.30模拟赛

1.盘子序列(disk) [题目描述] 有 n 个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一 个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的.称初始盘堆为 A,另外有一个开始为空的盘堆 B.为了掩盖失误,生产商会对盘子序列做一些“处 理”,每次进行以下操作中的一个:(1)将 A 最上面的盘子放到 B 最上面:(2)将 B 最上 面的盘子给你.在得到所有 n 个盘子之后,你需要判断初始盘堆里是否有危险的盘子. [输入格式] 输入文件包含多组数据(不超过 10 组

9.6noip模拟试题

题目名称 盘子序列 四轮车 点名 提交文件 disk.pas/c/cpp car.pas/c/cpp rollcall.pas/c/cpp 输入文件 disk.in car.in rollcall.in 输出文件 disk.out car.out rollcall.out 时间限制 1s 1s 1s 空间限制 128M 128M 128M 评测方式 传统 传统 传统 盘子序列 [题目描述] 有 n 个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一 个盘子比所有它上面的盘子都大,

170611 NOIP模拟赛

盘子序列 [题目描述] 有 n 个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一 个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的.称初始盘堆为 A,另外有一个开始为空的盘堆 B.为了掩盖失误,生产商会对盘子序列做一些“处 理”,每次进行以下操作中的一个:(1)将 A 最上面的盘子放到 B 最上面:(2)将 B 最上 面的盘子给你.在得到所有n个盘子之后,你需要判断初始盘堆里是否有危险的盘子. [输入格式] 输入文件包含多组数据(不超过 10 组) 每组数据的第一行

2017 6 11模拟赛

盘子序列 [题目描述] 有 n 个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一 个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的.称初始盘堆为 A,另外有一个开始为空的盘堆 B.为了掩盖失误,生产商会对盘子序列做一些“处 理” ,每次进行以下操作中的一个:(1)将 A 最上面的盘子放到 B 最上面:(2)将 B 最上 面的盘子给你. 在得到所有n个盘子之后, 你需要判断初始盘堆里是否有危险的盘子. [输入格式] 输入文件包含多组数据(不超过 10 组) 每组数据的

1279 扔盘子

思路:先将井口处理成递增的序列,然后再二分每个盘子插入的位置. 1 #include <iostream> 2 #include <queue> 3 #include <stack> 4 #include <cstdio> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <bitset> 9 #include <algori

06 序列:字符串、列表和元组 - 《Python 核心编程》

?? 序列简介 ?? 字符串 ?? 列表 ?? 元组 6.1 序列顺序访问 序列类型有着相同的访问模式:它的每一个元素可以通过指定一个偏移量的方式得到. 而多个元素可以通过切片操作的方式一次得到. 下标偏移量是从0 开始到总元素数-1 结束. 标准类型操作符 标准类型操作符一般都能适用于所有的序列类型. 序列类型操作符 成员关系操作符 (in, not in) 连接操作符( + ) 重复操作符 ( * ) 切片操作符 ( [], [:], [::] )  正负索引的区别在于正索引以序列的开始为起

51NOD 1279 扔盘子(二分 + 思维)

传送门 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去). 盘子有几种命运:1.掉到井底.2.被卡住.3.落到别的盘子上方. 盘子的高度也是单位高度.给定井的宽度和每个盘子的宽度,求最终落到井内的盘子数量. 如图井和盘子信息如下: 井:5 6 4 3 6 2 3 盘子:2 3 5 2 4 最终有4个盘子落在井内. 本题由 @javaman 翻译. Input 第1行:2个数N, M中间用空格分隔,

如何理解“字符串是一组由16位组成的不可变的有序序列”

疑惑点: 1.16位 2.不可变 3.有序序列 解惑: 1.16位指的是:字符串每个字符所占用的空间为16bits 比特(2 bytes);这是因为JS采用的是unicode编码,每个字符需要2个字符. 2.不可变指的是: 字符串对象一旦创建出来,便不能被更改.这可能有些难理解,但事实确实如此.你可能会认为s+='1' 只是在 s 后面增加一个元素 1 而已,但事实是: 先将 s 拷贝一份,记为 temp 在 temp 末尾加上'1' 将 s 变量指向 temp,并删去原来的s 这一特性,可以从