[C语言刷题]挖掘机技术哪家强

这是PAT乙级的一道题,我的代码没有通过最后一个测试点,原因推测是两层for循环在n较大时超时了。转而在牛客网运行,结果竟然神奇地AC了,可能牛客放宽了时间限制吧

题目描述

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

输入格式:

输入在第 1 行给出不超过 100000 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。

输出格式:

在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

输入样例:

1
2
3
4
5
6
7
6
3 65
2 80
1 100
2 70
3 40
3 0

输出样例:

1
2 150

我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
//保存起来到a数组
int a[n][2];
for(int i=0;i<n;++i)
{
scanf("%d %d",&a[i][0],&a[i][1]);
}
//按学校编号分组,统计各组的总成绩,存到b数组
int b[n][2];
int j=1;
b[0][0]=a[0][0];
b[0][1]=a[0][1];
for(int i=1;i<n;++i)
{
int flag=0;//某学校编号出现过的标志 ,0代表没目前还有出现过
for(int k=0;k<j;++k)
{
if(b[k][0]==a[i][0])//出现过了!
{
b[k][1]+=a[i][1];
flag=1;
break;
}
}
if(flag==0)//目前还没有出现过
{
b[j][0]=a[i][0];
b[j][1]=a[i][1];
++j;
}
}
//找出b数组中的最大值以及最大值对应的学校编号
int max=b[0][1],maxnum=b[0][0];
for(int k=0;k<j;++k)
{
if(b[k][1]>max)
{
max=b[k][1];
maxnum=b[k][0];
}
}

printf("%d %d",maxnum,max);


}

下面是牛客网上的代码,但是在PTA平台运行仍然不能AC,但是当我把a数组的长度再加一个0时,竟然又神奇地AC 了。。。

其实是这样的:第四个测试点是最大边界值,也就是100000,只要a数组的长度比100000大一点儿就可以了,于是取100001,这样即可AC。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
链接:https://www.nowcoder.com/questionTerminal/8ec60eb06fad461eb82ff30562eedc31?toCommentId=5770176&ran=351
来源:牛客网
*/

#include<stdio.h>
int main()
{
int a[100000]={0};//开了个大数组,下标可以对应到全部的学校编号
int n,x,y;
int max=0;//分数最高的学校编号
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&x,&y);
a[x]+=y;
if(a[x]>a[max])//实时更新某校最大分数
max=x;
}
printf("%d %d",max,a[max]);
return 0;
}

这种解法不用保存输入的信息,降低了时间复杂度(不需要像我写的一样的两层循环了)

开头直接开一个100001长度的数组,算是用空间换时间吧(PTA上这题的内存限制是64MB ,够用了)

凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条