C語言 PAT B1032 挖掘機技術哪家強 mw的解題思路和優化方案
文章目錄
題目
為了用事實說明挖掘機技術到底哪家強,PAT 組織了一場挖掘機技能大賽。現請你根據比賽結果統計出技術最強的那個學校。
輸入格式:
輸入在第 1 行給出不超過
1
0
5
10^5
105的正整數 N,即參賽人數。隨後 N 行,每行給出一位參賽者的資訊和成績,包括其所代表的學校的編號(從 1 開始連續編號)、及其比賽成績(百分制),中間以空格分隔。
輸出格式:
在一行中給出總得分最高的學校的編號、及其總分,中間以空格分隔。題目保證答案唯一,沒有並列。
輸入樣例:
6
3 65
2 80
1 100
2 70
3 403 0
輸出樣例:
2 150
解題思路
題目看起來似乎不難,好像就很普通的建立個數組存放輸入的學校和對於的分數,有重合的學校進行分數相加,最後全部相比較之後輸出最大的學校和分數就好。
但這是假象!
題目中小坑特別多,PAT系統中對答案的判定又很細,你要是簡單的按照上面的思路寫出來,雖然通過輸入輸出案例很簡單,但其他的測試點通過不了(會出現部分正確和段錯誤等等等問題。)
我在這題上面花了好久(分析又分析不出自己的問題可是測試點就是過不了)
接下來仔細講講題目中的小坑,首先就是輸入格式裡面的第一句話
輸入在第 1 行給出不超過 1 0 5 10^5 105的正整數 N
這裡並不是簡單的輸入一個正整數,不然它會用另一種方式說明(例“輸入一個正整數N,它不超過
1
0
5
10^5
(因為在主函式內定義的話會超過系統棧允許申請的空間範圍,而在主函式外申請的空間來自於靜態儲存區,允許申請的空間較大)
#include<stdio.h>
int a[100000][2]={0};
我使用的是二維陣列,因為這種方法最簡單最容易想到,學校標號對應的是第零列,第一列存放對應的分數。
隨後輸入,我這裡選用的是每輸入一行數就存放在兩個區域性變數x,y中,陣列中第x行對應的第一列與分數y相加。
for(int i=0;i<n;i++){
scanf("%d %d",& x,&y);
a[x][1]+=y;
}
接下來就是比較各個學校之間的分數大小,這裡注意題目中
包括其所代表的學校的編號(從 1 開始連續編號)
題目中這樣寫說明學校編號只會<=n,而不會跳躍編號,所以我們在比較時就不用把陣列中100000個數全部比較一遍,只用比較n個數就可以。既
for(int i=1;i<=n;i++){
if(a[max][1]<a[i][1]){
max=i;
}
隨後按題目要求輸出即可。
優化方案
這裡可以將二維陣列換為一維陣列,陣列下標對應的是學校,下標對應的陣列數對應的是學校分數。
總體程式碼
#include<stdio.h>
int a[100000]={0};
int main(){
int n,x,y,max=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d",&x,&y);
a[x]+=y;
}
for(int i=1;i<=n;i++){
if(a[max]<a[i]){
max=i;
}
}
printf("%d %d\n",max,a[max]);
return 0;
}
如果覺得有用的話給我個贊吧!謝謝觀看!