编号为 1 到 n 的 n 名玩家将参加循环赛。 具体来说,对于每一对 (i,j) (1≤i<j≤N),玩家 i 和玩家 j 比赛一次,总共 2N(N−1)次比赛。 在每场比赛中,一名玩家赢下比赛,另一名玩家将输掉比赛,没有平局。 现在 m 场比赛已经结束。在第 i 场比赛中,玩家 wi 赢得玩家 li. 请找出所有场次结束后可能成为胜利者的所有玩家。如果该玩家的获胜次数严格大于任何其他玩家的获胜次数,则称该玩家为胜利者。(注:未进行的比赛胜负不确定)
2≤ n ≤50
0≤ m ≤2n(n−1)
1≤wi, li≤n
wi = li
if i != j, then(wi,li)!=(wj,lj).
(wi,li)!=(lj,wj)
输入格式:
n m
w[1] l[1]
w[2] l[2]
...
w[m] l[m]
输出格式:
升序输出可能胜利者的集合,若无胜利者,则无需输出。
行末无空格
输入样例:
4 2
2 1
2 3
输出样例:
2 4
一下为我的代码
#include<iostream>
using namespace std;
int main(){
int n,m,w,l;
cin>>n>>m;
int W[n+1]={0},f[n+1],flag;
for(int i=1;i<n+1;i++){
W[i]=n-1;
f[i]=0;
}
for(int i=1;i<m+1;i++){
cin>>w>>l;
W[l]--;
}
int max=0;
for(int i=1;i<n+1;i++){
if(max<W[i])max=W[i];
}
for(int i=1;i<n+1;i++){
if(max==W[i]){
f[i]=1;
flag=i;
}
}
for(int i=1;i<n+1;i++){
if(f[i]==1){
cout<< i;
if(i!=flag)cout<<" ";
}
}
return 0;
}
在PTA上的25个测试点有10个正确,15个错误
希望得到改进方案,和知道疏忽的情况
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
unordered_map<int, int> scores;
while (m -- )
{
int w, l;
cin >> w >> l;
scores[w] ++;
scores[l] --;
}
vector<int> res;
int max_score = -1;
for (auto& [k, v] : scores)
{
if (v > max_score)
{
max_score = v;
res.clear();
res.push_back(k);
}
else if (v == max_score)
{
res.push_back(k);
}
}
for (int x : res) cout << x << " ";
return 0;
}