PAT B1032

题面:

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

输入格式:

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

输出格式:

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

输入样例:

3 65 
2 80 
1 100 
2 70 
3 40 
3 0

输出样例:

2 150


思路 一:

1.先循环设置输入,分别加入到两个不同的list中

2.寻找最大的学校编号,利用此编号循环计算不同学校的分组得分情况,记录在Mark的list中

3.循环遍历Mark,找出最大的分数,并将所在的list单元的第一个元素(学校编号)一起打印出来

无疑此种方法过于麻烦,比较好的方法还请继续往下看


Code[Python]:

N1=[]
N2=[]
n=int(input())

for i in range(1,n+1):
    data=input()
    n1=int(data.split(' ')[0])
    n2=int(data.split(' ')[1])
    N1.append(n1)
    N2.append(n2)
Mark=[]
for i in range(1,maxnum):
    socre=0
    p=0
    for j in N1:
        p=p+1
        if i==j:
            socre=socre+N2[p-1]
            Mark.append([j,socre])
maxscore=0
maxnum=0
for i in Mark:
    if maxscore<i[1]:
        maxscore=i[1]
        maxnum=i[0]
print(str(maxnum)+' '+str(maxscore))

思路 二:

1.令数组school[maxn]记录每个学校的总分,初值为0,对其每一个读入的学校 schlID 与对应的分数 score, 令school[schlID] += socre

2.令变量k记录最高总分的学校编号,变量Max记录最高得分,初值为-1,由于学校是连续编号的,因此枚举编号 1~N,不断更新k和MAX即可。


#include <studio> 
const int maxn =100010;

int school[maxn]={0};//记录每个学校的总分
int mian(){
	int n,schlID,score;
	scanf("%d",&n);
	for (int i=0;i<n;i++){
		scanf("%d%d",&schlID,&score);//学校ID,分数
		school[schlID]+=score; //学校schlID的总分增加score 
	}
	int k=1,Max=-1;//最高总分学校ID及其总分 
	for (int i=1;i<n;i++){//从所有学校中选出总分最高的一个 
		if(school[i]>MAX){
			MAX=school[i];
			k=i;
		}
	}
	printf("%d %d\n",k,MAX);//按要去输出 
	return 0;
} 

反思:

1.相较于C语言版的结果,自己Python的算法显然过于繁琐和麻烦,值得进一步进行改进

2.在写代码的过程中还是存在着列表、元组、数组、numpy、pandas混淆应用的情况,说明自己对这些部分的掌握程度还有待改进

猜你喜欢

转载自blog.csdn.net/AliceLeeHX/article/details/81287143