題面:
爲了用事實說明挖掘機技術到底哪家強,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混淆應用的情況,說明自己對這些部分的掌握程度還有待改進