1. 程式人生 > 其它 >1032 挖掘機技術哪家強 (20 分)

1032 挖掘機技術哪家強 (20 分)

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;
} 

示例輸出時對的,但是有部分錯誤。改過了之後對了

參考程式碼

陣列的定義與我的不一樣,下面這樣比較好。下次學習一下!

  1. 提前定義巨集定義陣列的最大值已經陣列
  2. cstdio是將stdio.h的內容用C++標頭檔案的形式表示出來
    cstdio 和 stdio.h是有差別的,並不是同樣的檔案
    stdio.h是以往的C和C++的標頭檔案,cstdio是標準C++(STL),且cstdio中的函式都是定義在一個名稱空間std裡面的,如果要呼叫這個名字空間的函式,必須得加std::或者在檔案中宣告using namespace std。
  3. 這個與迴圈的把每一個值和迴圈值比較的方法也很好,所以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++通道才能執行成功