【日常考试】2016.3.2 备战NOIP2014模拟赛1 前两题

来源:互联网 发布:圈圈助手显示没网络 编辑:程序博客网 时间:2024/05/13 19:29

备战Noip2014模拟赛1(什么鬼。。。)

题目名称

排名系统

历史事件

山区考察

机房病毒

存盘文件名

rank.pas

event.pas

mountain.pas

Virus.pas

输入文件名

rank.in

event.in

mountain.in

Virus.in

输出文件名

rank.out

event.out

mountain.out

Virus.out

时限

1s

1s

1s

1s

内存限制

64M

64M

64M

64M

注意事项:请自行完成题目,切勿讨论。

 

 

题1 排名系统

【问题描述】

    F1的影响力越来越大,因此国际汽联决定扩大规模,让更多有天赋的车手加入这一行列。

    不过规模的扩大带来了一系列问题,比如排名系统。由于参赛人数过多,排名系统要运行很久才能够得出结果。

    车迷们非常愤怒,强烈要求修改系统。于是,汽联召开紧急会议,决定在短期内重新编写该系统。

    F1排名的标准是:每场比赛的前八名可获得积分,从第一名到第八名分别获得:10,8,6,5,4,3,2,1个积分,车手总积分是该车手各场比赛获得的积分之和。每场比赛过后,排名系统都会将当前的车手总积分从大到小排序,若积分相等则编号小的车手排在前面。

    你的任务就是要编写这一系统。不过车迷们常常只关注第一名,因此,你只需在每场比赛过后输出排名第一的车手的编号即可。

【输入文件】

    输入文件rank.in。第一行是两个整数n,m(8<=n<=1000000,1<=m<=1000000),分别表示车手数和比赛场数。接下来m行,每行八个整数,第i行第j个是rij(1<=rij<=n),表示第i场比赛获得第j名的车手的编号。

【输出文件】

    输出文件rank.out。m行,第i行是一个整数ci,表示第i场比赛结束后排名第一的车手的编号。

【样例输入】

    143

    1 4 14 8 10 6 12 7

    4 6 14 8 3 11 1 13

    1 11 14 8 10 3 9 12

【样例输出】

    1

    4

    1

【数据规模】

    30%的数据满足n<=1000,m<=1000

 

每一场比赛过后总积分排名第一的车手一定是之前排名第一的车手或该场比赛中有得分的车手中的一位,因此用数组记录每位车手的总积分,但每次只比较上述9名车手即可。时间复杂度O(m)。

我会说我考试的时候把八个看成七个吗!!

定义:水题一枚

(我的做法和题解不同。。。只能说数据水了)

const jf:array[1..8] of integer=(10,8,6,5,4,3,2,1);var n,m,t,i,max,j,x:longint;    r:array[1..8] of longint;    b,f,c:array[1..1000001] of longint;begin    assign(input,'rank.in');reset(input);    assign(output,'rank.out');rewrite(output);    readln(n,m);    t:=0;    for i:=1 to m do begin        for j:=1 to 8 do read(r[j]);        readln;        for j:=1 to 8 do begin            if f[r[j]]=0 then begin                inc(t);                b[t]:=jf[j];                f[r[j]]:=1;                c[r[j]]:=t;                if (b[t]>max)or((b[t]=max)and(r[j]<x)) then begin                    max:=b[t];                    x:=r[j];                end;            end else begin                inc(b[c[r[j]]],jf[j]);                if (b[c[r[j]]]>max)or((b[c[r[j]]]=max)and(r[j]<x)) then begin                    max:=b[c[r[j]]];                    x:=r[j];                end;            end;        end;        writeln(x);    end;    close(input);    close(output);end.


 

 

 

 

题2历史事件

【问题描述】

一些历史迷们打算把历史上的一些大事件按时间顺序列出来。但是,由于资料不全,每个事件发生的具体时间都没有找到。幸运的是,他们记得一些事件之间的先后关系。他们把事件分别编号1,2,3,……n,然后把一些先后关系列出。不过,这些复杂的先后关系仍然把他们难倒了。你能够帮助他们吗?

【输入文件】

输入文件event.in。第一行是两个整数n,m(1<=n<=1000,1<=m<=100000),分别表示事件数和已知的先后关系数。接下来m行,第i行是两个整数xi,yi(1<=xi,yi<=n),表示事件xi比事件yi先发生。

【输出文件】

输出文件event.out。按事件发生的时间顺序列出事件的编号,每行一个,若存在多种可能,输出第一个事件编号最小的,若第一个事件编号相同,则输出第二个事件编号最小的……;若没有满足条件的编号序列,输出一行’Error!’)。

【样例输入】

3 2

1 2

1 3

【样例输出】

1

2

3

本题由于是纯拓扑排序题,已在新文拓扑排序专题中提及,敬请留意


30+0完挂(第一题竟然还有30我也是醉了。。。)

1 0
原创粉丝点击