[问题描述]
为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的第一项内容是做游戏:猜数。老师给每位同学发一张卡片,每张卡片上都有一个编号(此编号为非负数,且小于255),每个编号互不相同。老师制定了以下的游戏规则:第一轮,每位同学将自己卡片上编号的各位数字进行平方后再相加得到一组新数,编号在这组新数中出现的同学淘汰出局,第二轮,余下的同学再将编号的各位数字进行立方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,第三轮,余下的同学再将编号的各位数字进行4次方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,……,以此类推,经过n轮后,仍留下来的同学,将获得圣诞特别礼物,卡片上的数即为2007年吉祥数。(假定班级人数不超过200人)
[输入文件]
输入文件ghillie .in 有两行,第1行为1个正整数n(n<8),表示有n轮游戏,第二行是卡片上互不相同的编号。
输出:剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
[输出文件]
输出文件ghillie .out是1行,为剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
[输入样例]
1
24 123 2 12 20 14 4 6 36 72
[输出样例]
2 6 12 24 72 123
解题思路
这个数据规模不是很大,简简单单的模拟就可以AC,但是有一点比较坑人的就是:每次必须先计算完所有的人的数字,再进行踢人,否则的话前面计算出来就立刻把后面的人踢除了,这样后面的那个人的数字就没有被计算,那么就会留下几个 不应该被留下的小孩。
这告诫我们模拟就要老老实实模拟,不要ZB,@显摆
代码
var j,i,sum,n:integer;
a,b:array[1..200]of longint;
function jie(n,k:integer):longint;
var a,b,sum,ji,i:longint;
begin
sum:=0;
while n>0 do
begin
a:=n mod 10;
n:=n div 10;
ji:=1;
for i:=1 to k+1 do ji:=ji*a;
sum:=sum+ji;
end;
exit(sum);
end;
procedure check(n:longint);
var i:integer;
begin
for i:=1 to sum do
if a[i]=n then begin a[i]:=0;exit;end;
end;
procedure qsort(b,e:integer);
var l,r,t,m:longint;
begin
l:=b;r:=e;m:=a[(l+r)>>1];
while l<r do
begin
while a[l]<m do inc(l);
while m<a[r] do dec(r);
if l<=r then
begin
t:=a[l];
a[l]:=a[r];
a[r]:=t;
inc(l);
dec(r);
end;
end;
if l<e then qsort(l,e);
if b<r then qsort(b,r);
end;
begin
readln(n);
sum:=0;
while not eoln do
begin
inc(sum);
read(a[sum]);
end;
for i:=1 to n do
begin
fillchar(b,sizeof(b),0);
for j:=1 to sum do
if a[j]<>0 then b[j]:=jie(a[j],i);
for j:=1 to sum do check(b[j]);
end;
qsort(1,sum);
for i:=1 to sum do if a[i]<>0 then write(a[i],' ');
end.
测试点1 Accepted / 0ms / 260kB
测试点2 Accepted / 0ms / 260kB
测试点3 Accepted / 0ms / 260kB
测试点4 Accepted / 0ms / 260kB
测试点5 Accepted / 0ms / 260kB
测试点6 Accepted / 0ms / 260kB
测试点7 Accepted / 0ms / 260kB
测试点8 Accepted / 0ms / 260kB
测试点9 Accepted / 0ms / 260kB
测试点10 Accepted / 0ms / 260kB