1. 程式人生 > 其它 >C語言 PAT B1032 挖掘機技術哪家強 mw的解題思路和優化方案

C語言 PAT B1032 挖掘機技術哪家強 mw的解題思路和優化方案

技術標籤:mw的刷題之路c語言

文章目錄

題目

為了用事實說明挖掘機技術到底哪家強,PAT 組織了一場挖掘機技能大賽。現請你根據比賽結果統計出技術最強的那個學校。

輸入格式:
輸入在第 1 行給出不超過 1 0 5 10^5 105的正整數 N,即參賽人數。隨後 N 行,每行給出一位參賽者的資訊和成績,包括其所代表的學校的編號(從 1 開始連續編號)、及其比賽成績(百分制),中間以空格分隔。

輸出格式:
在一行中給出總得分最高的學校的編號、及其總分,中間以空格分隔。題目保證答案唯一,沒有並列。

輸入樣例:

6
3 65
2 80
1 100
2 70
3 40

3 0

輸出樣例:

2 150

解題思路

題目看起來似乎不難,好像就很普通的建立個數組存放輸入的學校和對於的分數,有重合的學校進行分數相加,最後全部相比較之後輸出最大的學校和分數就好。

但這是假象!

題目中小坑特別多,PAT系統中對答案的判定又很細,你要是簡單的按照上面的思路寫出來,雖然通過輸入輸出案例很簡單,但其他的測試點通過不了(會出現部分正確和段錯誤等等等問題。)
我在這題上面花了好久(分析又分析不出自己的問題可是測試點就是過不了)

接下來仔細講講題目中的小坑,首先就是輸入格式裡面的第一句話

輸入在第 1 行給出不超過 1 0 5 10^5 105的正整數 N

這裡並不是簡單的輸入一個正整數,不然它會用另一種方式說明(例“輸入一個正整數N,它不超過 1 0 5 10^5

105”),所以這裡是提示我們要在第一行建立一個數組空間大小為100000的一維或二維陣列。

(因為在主函式內定義的話會超過系統棧允許申請的空間範圍,而在主函式外申請的空間來自於靜態儲存區,允許申請的空間較大)

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

如果覺得有用的話給我個贊吧!謝謝觀看!