题面:
为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。
输入格式:
输入在第1行给出不超过10的5次方的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。
输出格式:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
输入样例:
6
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混淆应用的情况,说明自己对这些部分的掌握程度还有待改进