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混淆應用的情況,說明自己對這些部分的掌握程度還有待改進

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章