https://ac.nowcoder.com/acm/contest/67741/E
看到这题目还真以为是贪心,还真写了一个贪心的代码。
如果1号选手和别人比拼,1号选手胜,
如果非1号选手的两个选手比拼,分数已经比1号选手高的胜,
否则平局。
//错误答案
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b) {return a>b;}
int main(){
int T;cin>>T;
while(T--){
int n,m;cin>>n>>m;
int a[n+2];
int u[m+2],v[m+2];
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>u[i]>>v[i];
for(int i=1;i<=m;i++){
if(u[i]==1||v[i]==1) a[1]+=3;
}
for(int i=1;i<=m;i++){
if(u[i]==1||v[i]==1) continue;
if (a[u[i]]>a[1]) a[u[i]]+=3;
else if(a[v[i]]>a[1]) a[v[i]]+=3;
else if(a[u[i]]+3<=a[1]) a[u[i]]+=3;
else if(a[v[i]]+3<=a[1]) a[v[i]]+=3;
else{
a[u[i]]++;
a[v[i]]++;
}
}
int tar=a[1];
int ans;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
if(a[i]==tar) {
ans=i;
break;
}
}
cout<<ans<<endl;
}
}
看了题解,这道题的正确做法是DFS所有情况,因为数据范围很小。
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int ans=100;
int u[12],v[12];
int n,m;
int a[12];
void dfs(int x){
if(x==m+1){
int cnt=1;
for(int i=1;i<=n;i++){
if(a[i]>a[1]) cnt++;
}
ans=min(ans,cnt);
return;
}
a[u[x]]+=3;
dfs(x+1);
a[u[x]]-=3;
a[v[x]]+=3;
dfs(x+1);
a[v[x]]-=3;
a[u[x]]++;a[v[x]]++;
dfs(x+1);
a[u[x]]--;a[v[x]]--;
}
signed main(){
int T;cin>>T;
while(T--){
cin>>n>>m;
ans=100;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>u[i]>>v[i];
dfs(1);
cout<<ans<<endl;
}
}