题目来源:2025 Wuhan University of Technology Programming Contest
比赛链接:Dashboard - 2025 Wuhan University of Technology Programming Contest - Codeforces
题目大意:
模拟 16 支队伍的瑞士轮比赛结果,规则太多,直接上题面吧。
Solution:
依题意模拟,将每一轮胜负场次相同的队伍放进一个 vector 里,按照规则排序。
总之就是很暴力。。。
不过好在这题打起来并没有看上去那么复杂,规划好每个子函数的功能,思路还是非常清晰的,很快就能码完。
(其实代码可以更短,但为了体现每一步清楚的思路,多打一点也没什么,模拟题就是要求稳)
Code:
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;int win[20][20],race[20][20],vis[20],b[10];vector<int> t1,t2,t3;struct Team
{int winned,losed,sum;vector<int> rival;
}a[20];void battle(int x,int y)
{race[x][y] = race[y][x] = 1;if(win[x][y]) ++ a[x].winned,++ a[y].losed;else ++ a[x].losed,++ a[y].winned;a[x].rival.push_back(y);a[y].rival.push_back(x);return;
}void calc()
{for (int i = 1;i <= 16;++ i){int tmp = 0;for (auto j : a[i].rival)tmp += a[j].winned - a[j].losed;a[i].sum = tmp;}return;
}int cmp(int x,int y)
{if(a[x].sum == a[y].sum) return x < y;else return a[x].sum > a[y].sum;
}void round1()
{for (int i = 1;i <= 8;++ i) battle(i,i + 8);t1.clear();t2.clear();for (int i = 1;i <= 16;++ i)if(a[i].winned == 1) t1.push_back(i);else t2.push_back(i);calc();sort(t1.begin(),t1.end(),cmp);sort(t2.begin(),t2.end(),cmp);return;
}void round2()
{memset(vis,0,sizeof vis);for (auto i : t1){if(vis[i]) continue;for (auto it = t1.rbegin();it != t1.rend();++ it){int j = *it;if(vis[j]) continue;if(race[i][j]) continue;battle(i,j);vis[i] = vis[j] = 1;break;}} for (auto i : t2){if(vis[i]) continue;for (auto it = t2.rbegin();it != t2.rend();++ it){int j = *it;if(vis[j]) continue;if(race[i][j]) continue;battle(i,j);vis[i] = vis[j] = 1;break;}}t1.clear();t2.clear();t3.clear();for (int i = 1;i <= 16;++ i)if(a[i].winned == 2) t1.push_back(i);else if(a[i].winned == 1) t2.push_back(i);else t3.push_back(i);calc();sort(t1.begin(),t1.end(),cmp);sort(t2.begin(),t2.end(),cmp);sort(t3.begin(),t3.end(),cmp);return;
}void round3()
{memset(vis,0,sizeof vis);for (auto i : t1){if(vis[i]) continue;for (auto it = t1.rbegin();it != t1.rend();++ it){int j = *it;if(vis[j]) continue;if(race[i][j]) continue;battle(i,j);vis[i] = vis[j] = 1;break;}} for (auto i : t2){if(vis[i]) continue;for (auto it = t2.rbegin();it != t2.rend();++ it){int j = *it;if(vis[j]) continue;if(race[i][j]) continue;battle(i,j);vis[i] = vis[j] = 1;break;}}for (auto i : t3){if(vis[i]) continue;for (auto it = t3.rbegin();it != t3.rend();++ it){int j = *it;if(vis[j]) continue;if(race[i][j]) continue;battle(i,j);vis[i] = vis[j] = 1;break;}}t1.clear();t2.clear();t3.clear();for (int i = 1;i <= 16;++ i)if(a[i].winned == 2 && a[i].losed == 1) t1.push_back(i);else if(a[i].winned == 1 && a[i].losed == 2) t2.push_back(i);calc();sort(t1.begin(),t1.end(),cmp);sort(t2.begin(),t2.end(),cmp);return;
}void run()
{int flag = 0;if(!race[b[1]][b[6]] && !race[b[2]][b[5]] && !race[b[3]][b[4]])battle(b[1],b[6]),battle(b[2],b[5]),battle(b[3],b[4]),flag = 1;if(flag) return;if(!race[b[1]][b[6]] && !race[b[2]][b[4]] && !race[b[3]][b[5]])battle(b[1],b[6]),battle(b[2],b[4]),battle(b[3],b[5]),flag = 1;if(flag) return;if(!race[b[1]][b[5]] && !race[b[2]][b[6]] && !race[b[3]][b[4]])battle(b[1],b[5]),battle(b[2],b[6]),battle(b[3],b[4]),flag = 1;if(flag) return;if(!race[b[1]][b[5]] && !race[b[2]][b[4]] && !race[b[3]][b[6]])battle(b[1],b[5]),battle(b[2],b[4]),battle(b[3],b[6]),flag = 1;if(flag) return;if(!race[b[1]][b[4]] && !race[b[2]][b[6]] && !race[b[3]][b[5]])battle(b[1],b[4]),battle(b[2],b[6]),battle(b[3],b[5]),flag = 1;if(flag) return;if(!race[b[1]][b[4]] && !race[b[2]][b[5]] && !race[b[3]][b[6]])battle(b[1],b[4]),battle(b[2],b[5]),battle(b[3],b[6]),flag = 1;if(flag) return;if(!race[b[1]][b[6]] && !race[b[2]][b[3]] && !race[b[4]][b[5]])battle(b[1],b[6]),battle(b[2],b[3]),battle(b[4],b[5]),flag = 1;if(flag) return;if(!race[b[1]][b[5]] && !race[b[2]][b[3]] && !race[b[4]][b[6]])battle(b[1],b[5]),battle(b[2],b[3]),battle(b[4],b[6]),flag = 1;if(flag) return;if(!race[b[1]][b[3]] && !race[b[2]][b[6]] && !race[b[4]][b[5]])battle(b[1],b[3]),battle(b[2],b[6]),battle(b[4],b[5]),flag = 1;if(flag) return;if(!race[b[1]][b[3]] && !race[b[2]][b[5]] && !race[b[4]][b[6]])battle(b[1],b[3]),battle(b[2],b[5]),battle(b[4],b[6]),flag = 1;if(flag) return;if(!race[b[1]][b[4]] && !race[b[2]][b[3]] && !race[b[5]][b[6]])battle(b[1],b[4]),battle(b[2],b[3]),battle(b[5],b[6]),flag = 1;if(flag) return;if(!race[b[1]][b[3]] && !race[b[2]][b[4]] && !race[b[5]][b[6]])battle(b[1],b[3]),battle(b[2],b[4]),battle(b[5],b[6]),flag = 1;if(flag) return;if(!race[b[1]][b[2]] && !race[b[3]][b[6]] && !race[b[4]][b[5]])battle(b[1],b[2]),battle(b[3],b[6]),battle(b[4],b[5]),flag = 1;if(flag) return;if(!race[b[1]][b[2]] && !race[b[3]][b[5]] && !race[b[4]][b[6]])battle(b[1],b[2]),battle(b[3],b[5]),battle(b[4],b[6]),flag = 1;if(flag) return;if(!race[b[1]][b[2]] && !race[b[3]][b[4]] && !race[b[5]][b[6]])battle(b[1],b[2]),battle(b[3],b[4]),battle(b[5],b[6]),flag = 1;if(flag) return;
}void round4()
{memset(b,0,sizeof b);int cnt = 0;for (auto i : t1) b[++ cnt] = i;run();memset(b,0,sizeof b);cnt = 0;for (auto i : t2) b[++ cnt] = i;run();t1.clear();for (int i = 1;i <= 16;++ i)if(a[i].winned == 2 && a[i].losed == 2) t1.push_back(i);calc();sort(t1.begin(),t1.end(),cmp);return;
}void round5()
{memset(b,0,sizeof b);int cnt = 0;for (auto i : t1) b[++ cnt] = i;run();return;
}int main()
{for (int i = 1;i <= 15;++ i)for (int j = 1,op;j <= 16 - i;++ j)scanf("%d",&op),win[i][i + j] = op , win[i + j][i] = op ^ 1;round1();round2();round3();round4();round5();for (int i = 1;i <= 16;++ i) printf("%d %d\n",a[i].winned,a[i].losed);return 0;
}