P5741 【深基7.例10】旗鼓相當的對手 - 加強版

HelloHeBin發表於2024-03-22
  • 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;
}

相關文章