盘子序列
【题目描述】
有 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.