練習題GRYZ2015 足球聯賽(重慶一中高2018級信息學競賽測驗4) 解題報告

【問題描述】  
    XX中學新一季的足球聯賽開幕了。足球聯賽有 n只球隊參賽,每賽季,每隻球隊要與其他球隊各賽兩場,主客各一場,贏一場得 3 分,輸一場不得分,平局兩隻隊伍各得一分。 
 英勇無畏的小鴻是機房的主力前鋒,她總能在關鍵時刻踢出一些匪夷所思的妙球。但是很可惜,她過早的燃燒完了她的職業生涯,不過作爲一個能夠 Burning 的 girl,她的能力不止如此,她還能預測這個賽季所有球隊的比賽結果。 
 雖然她能準確預測所有比賽的結果,但是其實她不怎麼厲害,Mr.Gao 上數學課時她總是在 sleep,因此她的腦裏只有整數沒有實數,而且,她只會 10 以內非負整數的加法運算,因此她只有結果卻無法知道誰會獲得聯賽的冠軍。 
 小鴻想給冠軍隊伍的所有隊員一個擁抱,所以她把計算結果的任務交給了你:現在,給你一個 n*n 的矩陣表示比賽情況。第 i 行第 j 列的字母表示在第 i 只隊伍在主場迎戰第 j 只隊伍的比賽情況,W 表示主隊贏,L 表示主隊輸,D 表示平局。現在需要你給出最後能得到小鴻擁抱的隊伍編號,如有多支隊伍分數最高,按字典序輸出編號。 
【輸入格式】  
第一行一個整數 n。
接下來 n 行,每行 n 個字符,表示輸贏情況。第 i 行第 i 列爲 - ,因爲一隻隊伍不可能與自己比賽。
【輸出格式】  
輸出得分最高的隊伍編號。如有多個在一行中輸出,用一個空格分開。
【輸入輸出樣例1】
football.in
3
-WW
W-W

WW-

football.out

1 2 3


【輸入輸出樣例2】
football.in
5
-DWWD
L-WLL
DD-WD
DDL-L
DDLL- 

football.out

1


【數據範圍】  
對於 40%的數據,滿足 N<=20

對於 100%的數據,滿足 N<=50


做題思路(正解):本題比較簡單,直接循環枚舉每場比賽,若主隊勝,則主隊加3分;若平局,則主客隊各加1分;若主隊敗,則客隊加3分。最後按每支球隊的總分由大到小排序(總分相同,按編號由小到大排序),需要注意的是,可能最高分的球隊不止一支,排序後先記錄最高分,然後枚舉每支球隊的得分,當該球隊得分小於最高分時,跳出循環。


#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=55;
int N;
char s[maxn][maxn];
struct data
{
	int sum,id;
};
data a[maxn];
bool cmp(data aa,data bb)
{
	if(aa.sum!=bb.sum)  return aa.sum>bb.sum;
	else  return aa.id<bb.id;  //得分相同時,按編號由小到大(字典序)排序 
}
int main()
{
	freopen("football.in","r",stdin);
	freopen("football.out","w",stdout);
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
	scanf("%s",s[i]);
	memset(a,0,sizeof(a));
	for(int i=1;i<=N;i++)
	for(int j=0;j<N;j++)  //計算每支球隊的得分 
	{	
		if(s[i][j]=='W')  a[i].sum+=3;
		if(s[i][j]=='D')  
		{
			a[i].sum++;	
			a[j+1].sum++;
		}
		if(s[i][j]=='L')  a[j+1].sum+=3;
	}
	for(int i=1;i<=N;i++)
	a[i].id=i;
	sort(a+1,a+1+N,cmp);  //按球隊的得分由大到小排序 
	int k=a[1].sum;
	for(int i=1;i<=N;i++)  //查找是否有多支得分最高的隊伍 
	if(a[i].sum==k)  printf("%d ",a[i].id);
	else  break;
	return 0;
}
考後反思:看題時一定要細心,比如這道題,每兩支球隊間會有兩場比賽,考試之前在題庫上做的時候,算成了每兩支球隊間只有一場比賽,結果糾結了大半天。。。

發佈了57 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章