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

排行榜

时间:2015-10-25 16:29:18      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:

排行榜

源程序名    LIST.??? (PAS,C,CPP)

可执行文件名   LIST.EXE

输入文件名   LIST.IN

输出文件名     LIST.OUT

 

小迈克尔住在一个小镇上,他喜欢看每周日下午发布的音乐电视评比。它每周都根据选票介绍相同的歌曲,列出这些歌曲的流行排行榜。

有一个星期日迈克尔和他的朋友在一起玩得太久了以致于未能看到新的流行榜。他非常失望,但是不久他就发现下周至少可以部分地建立出流行榜。除了每首歌曲的位置,排行榜还根据这些歌曲上周的排行列出了它们排行变动的信息,更精确地说,从这周起,不管那首歌是继续排在原位,还是排名上升或排名下降,都会给出一点说明。

编写程序,根据给定的流行榜帮助迈克尔推断出上周可能的排行榜。

 

输入

输入文件的第一行是一个整数N,1≤N≤100,表示排行榜上歌曲的总数。

接下来的N块列出了排行信息。每块有两行组成,第i块第一行是第i首歌曲的名称,歌名包括最多不超过100个英文大写字母,第二行包含下列三个单词中的一个:UP(歌曲在排行榜上的位置上升),DOWN(歌曲在排行榜上的位置下滑)或SAME(排行不变),表示与上周排行榜相比,排行榜所发生的变动。

 

输出

输出文件应该用N行输出一个上周可能的排行榜。

每一行包含一首歌名,即第i行包含排行榜上第i首歌的歌名。

注意:解不必是唯一的,但对于每一个测试数据都至少有一个解。

 

样例

LIST.IN

5

HIGHHOPES

UP

LOWFEELINGS

UP

UPANDDOWN

DOWN

IAMSTILLSTANDING

DOWN

FOOLINGAROUND

DOWN

 

LIST.OUT

UPANDDOWN

IAMSTILLSTANDING

FOOLINGAROUND

HGHHOPES

LOWFEELINGS

思路:题目中也说了,答案有多种。但是,但凡有脑子的人就会知道:不是你随便输出一个就可以过的。(你以为会给你设上多个样例输出让你中一个就算啊 (ˉ▽ ̄~) 切~~)

本大爷看了看样例,第一次以为是要把所有的相邻的up和down调整一下(把up给挪到下面,down挪到上面),所以就先从1循环到n,在判断了一下,把每一块都zhihuan(自己写的过程)了一下。

像这样:

j:=1;
for i:=1 to n do
begin
    if a[i,2]:=UP then inc(l1);
    if a[i,2]:=DOWN then inc(l2);
    if ((l1<>0)and(l2<>0)and(a[i+1]=UP))or(i=n) then//我所说的一块,就是连续的up和连续的down(其中可加same)
        zhihuan(j,i);
    j:=i+1;
end;

(在下面程序中的1处)

 结果在洛谷上提交的时候只过两个点。自己看了看老师给的样例,发现自己想多了,直接zhihuan(1,n)就好了O__O "…

然后就改了一改,AC了O(∩_∩)O

program aa;
var n,i,j,k:longint;
    a:array[1..100,1..2]of ansistring;
    b:array[1..100]of ansistring;
    s1,s2,s3:ansistring;
    l1,l2:longint;
procedure open;
begin
    assign(input,list.in);
    assign(output,list.out);
    reset(input);
    rewrite(output);
end;

procedure closs;
begin
    close(input);
    close(output);
end;
procedure zhihuan(l,r:longint);//zhihuan这个过程就是为了把区域内所有的up平移到下面,down平移到上面(平移 平移 平移)
var i,j:longint;
    ls,lj:longint;
    sheng,jiang:array[1..100]of longint;
begin
    ls:=0;
    lj:=0;
    fillchar(sheng,sizeof(sheng),0);
    fillchar(jiang,sizeof(jiang),0);
    for i:=l to r do
        if a[i,2]=s1 then//把所有为up的序号.按.顺.序.记下来
begin inc(ls); sheng[ls]:=i; end; for i:=l to r do if a[i,2]=s2 then//把所有为down的序号.按.顺.序.记下来 begin inc(lj); jiang[lj]:=i; end; j:=0; for i:=l to r do if a[i,2]<>s3 then//原位置为same的话,就不要动它了 begin inc(j); if j<=lj then b[i]:=a[jiang[j],1];//在其余位置上先.依.次.放.入.为down的 if j>lj then b[i]:=a[sheng[j-lj],1];//放完为down的,再放为up的。(因为down的原本比较靠前) end; end; begin open; s1:=UP; s2:=DOWN; s3:=SAME; readln(n); for i:=1 to n do begin readln(a[i,1]); readln(a[i,2]); end; for i:=1 to n do//先把为same的赋进去 if a[i,2]=s3 then b[i]:=a[i,1]; {1}zhihuan(1,n);for i:=1 to n do writeln(b[i]); closs; end.

一点反思:真不懂有些人样例都没过就去提交,就算你符合按照题目的要求也不至于跟分数过不去吧.

还有旁边那个AC了的,你TM瞎哔哔啥,你A都A了哪来那么多废话。(#‵′)凸

排行榜

标签:

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

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