1. 程式人生 > 實用技巧 >I Tournament(倆人一組,構造最少排隊總時間)

I Tournament(倆人一組,構造最少排隊總時間)

題: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(
false); 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; }
View Code