1032 挖掘機技術哪家強 (20 分)
阿新 • • 發佈:2021-07-17
1032 挖掘機技術哪家強 (20 分)
為了用事實說明挖掘機技術到底哪家強,PAT 組織了一場挖掘機技能大賽。現請你根據比賽結果統計出技術最強的那個學校。
輸入格式:
輸入在第 1 行給出不超過 105 的正整數 N,即參賽人數。隨後 N 行,每行給出一位參賽者的資訊和成績,包括其所代表的學校的編號(從 1 開始連續編號)、及其比賽成績(百分制),中間以空格分隔。
輸出格式:
在一行中給出總得分最高的學校的編號、及其總分,中間以空格分隔。題目保證答案唯一,沒有並列。
輸入樣例:
6
3 65
2 80
1 100
2 70
3 40
3 0
輸出樣例:
2 150
思路
- 令陣列school[maxn]記錄每一個學校的總分,初值為0。對每一個讀入的學校schId與其對應的分數score,令school[schId]+=score
- 令變數k記錄最高總分的學校編號,變數MAX記錄最高總分,初值為-1.由於學校是連續編號的,因此列舉1~N,不斷更新k和MAX即可
我的程式碼
#include<stdio.h> int main(){ int n, k = 1, MAX = -1;//用k記錄最大總分的學校的編號 int school[100000]= {0};//記錄每個學校的總分 int schId, score; scanf("%d", &n); //這段是我寫錯的,因為學號是從1開始的,所以這樣的話可能前面沒有問題,但時編號一大就會出現問題,一直部分錯誤 /*for(int i = 0; i < n; i++)*/ for(int i = 1; i <= n; i++){//但是就算這樣寫,投到c通道還是有部分錯誤,投c++通道是正確的 scanf("%d %d", &schId, &score); school[schId] += score;//把相同學校編號的成員的分數相加記錄總分 } for(int i = 1; i <= n; i++){ if(school[i] >MAX){//把每個學校的總分和max比較,誰更大誰更新給max,找出最大值 k = i; MAX = school[i]; } } printf("%d %d", k, MAX); return 0; }
示例輸出時對的,但是有部分錯誤。改過了之後對了
參考程式碼
陣列的定義與我的不一樣,下面這樣比較好。下次學習一下!
- 提前定義巨集定義陣列的最大值已經陣列
- cstdio是將stdio.h的內容用C++標頭檔案的形式表示出來。
cstdio 和 stdio.h是有差別的,並不是同樣的檔案
stdio.h是以往的C和C++的標頭檔案,cstdio是標準C++(STL),且cstdio中的函式都是定義在一個名稱空間std裡面的,如果要呼叫這個名字空間的函式,必須得加std::或者在檔案中宣告using namespace std。 - 這個與迴圈的把每一個值和迴圈值比較的方法也很好,所以MAX的初始值要設為-1,因為最低值是0。學習!!學習!!
#include<cstdio>
const int maxn = 100010;
int school[maxn] = {0};
int main(){
int n, k = 1, MAX = -1;//用k記錄最大總分的學校的編號
int schId, score;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %d", &schId, &score);
school[schId] += score;//把相同學校編號的成員的分數相加記錄總分
}
for(int i = 1; i <= n; i++){
if(school[i] >MAX){//把每個學校的總分和max比較,誰更大誰更新給max,找出最大值
k = i;
MAX = school[i];
}
}
printf("%d %d", k, MAX);
return 0;
}
注意:上面程式碼在測試是要傳入c++通道才能執行成功