- P5741 【深基7.例10】旗鼓相當的對手 - 加強版
【深基7.例10】旗鼓相當的對手 - 加強版
題目描述
現有 \(N(N\le 1000)\) 名同學參加了期末考試,並且獲得了每名同學的資訊:姓名(不超過 \(8\) 個字元的字串,沒有空格)、語文、數學、英語成績(均為不超過 \(150\) 的自然數)。如果某對學生 \(\text{<}i,j\text{>}\) 的每一科成績的分差都不大於 \(5\),且總分分差不大於 \(10\),那麼這對學生就是“旗鼓相當的對手”。現在我們想知道這些同學中,哪些是“旗鼓相當的對手”?請輸出他們的姓名。
所有人的姓名是按照字典序給出的,輸出時也應該按照字典序輸出所有對手組合。也就是說,這對組合的第一個名字的字典序應該小於第二個;如果兩個組合中第一個名字不一樣,則第一個名字字典序小的先輸出;如果兩個組合的第一個名字一樣但第二個名字不同,則第二個名字字典序小的先輸出。
輸入格式
第一行輸入一個正整數 \(N\),表示學生個數。
第二行開始,往下 \(N\) 行,對於每一行首先先輸入一個字串表示學生姓名,再輸入三個自然數表示語文、數學、英語的成績。均用空格相隔。
輸出格式
輸出若干行,每行兩個以空格隔開的字串,表示一組旗鼓相當的對手。注意題目描述中的輸出格式。
樣例 #1
樣例輸入 #1
3
fafa 90 90 90
lxl 95 85 90
senpai 100 80 91
樣例輸出 #1
fafa lxl
lxl senpai
提示
資料保證,\(1 \leq N \leq 1000\),姓名為長度不超過 \(8\) 的字串,語文、數學、英語成績均為不超過 \(150\) 的自然數。
- 參考程式
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
struct T{
string name;
int s1,s2,s3;
int s4(){
return s1+s2+s3;
}
}tt[N];
bool chk(int x,int y){
if(abs(tt[x].s1 - tt[y].s1) > 5) return false;
if(abs(tt[x].s2 - tt[y].s2) > 5) return false;
if(abs(tt[x].s3 - tt[y].s3) > 5) return false;
if(abs(tt[x].s4() - tt[y].s4()) > 10) return false;
return true;
}
int main(){
int n; cin>>n;
string name;
int s1,s2,s3;
for(int i=1; i<=n; i++){
cin>>name>>s1>>s2>>s3;
tt[i] = {name, s1,s2,s3};
}
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++)
if(chk(i,j))
cout<<tt[i].name<<" "<<tt[j].name<<endl;
return 0;
}