码迷,mamicode.com
首页 > 其他好文 > 详细

盘子序列

时间:2015-10-13 22:45:14      阅读:439      评论:0      收藏:0      [点我收藏+]

标签:

盘子序列

 【题目描述】

 有 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.

盘子序列

标签:

原文地址:http://www.cnblogs.com/liuxinyu/p/4876049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!