I Tournament(倆人一組,構造最少排隊總時間)
阿新 • • 發佈:2020-08-11
題:https://ac.nowcoder.com/acm/contest/5675/I
題意:有n個人,相當於每個人要和其他人組隊一次,問如何畫組隊才能使每個人總的停留時間最少,停留時間為每個人結束組隊時間-開始組隊時間
題意:要均攤等待時間才能達到總時間最少,因為若假設一個人先走,那麼後面人等待總時間無疑是會變更大。
把n個人分成1~n/2前面部分,n/2+1~n後面部分;
分為三部分組隊:前面和前面,前面和後面,後面和後面
(等待人數一定是先遞增後遞減)
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(View Codefalse); cin.tie(0),cout.tie(0); int T; cin>>T; while(T--){ int n; cin>>n; ///前對前 for(int i=2;i<=n/2;i++) for(int j=1;j<i;j++) cout<<i<<' '<<j<<'\n'; ///前對後 for(int i=n/2+1;i<n;i++)for(int j=1;j<=n-i;j++) cout<<i<<' '<<j<<'\n'; ///讓前面部分要走的時間儘量推後 for(int i=1;i<=n/2;i++) for(int j=n-i+1;j<=n;j++) cout<<i<<' '<<j<<'\n'; ///後對後 for(int i=n/2+1;i<n;i++)for(int j=i+1;j<=n;j++) cout<<i<<' '<<j<<'\n'; } return 0; }