ALGORITHM NOTE / ARCHIVE

24牛客寒假营E题解

题目大意: 一开始n个人已经有各自积分,经过m次比赛,问一号选手最高能排到第几名

E题链接

题目大意: 一开始n个人已经有各自积分,经过m次比赛,问一号选手最高能排到第几名

输入描述: t(测试组数)1-100 n个数字初始积分ai n属于2-10 ai<=100 m行比赛双方 1-10

分析:题目数据给的比较小,用dfs暴力即可求解,剪枝优化什么的也不用考虑

//诈骗题 写dfs
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

int n,m,ran;
int a[12];

struct ty2{
	int u,v;
}comp[13];

void dfs(int x){
	if(x==m+1){
		int r=1;
		for(int i = 1;i<=n;++i) r+=(a[i]>a[1]);
		ran= min(ran,r);
        //for(int i = 1;i<=n;++i) cout<<a[i]<<" ";
        //cout<<endl;
		return;
	}
	
	int u= comp[x].u,v = comp[x].v;
   // cout<<u<<" aaaa"<<v<<"\n";
	a[u]+=3;
	dfs(x+1);
	a[u]-=3;
	
	a[v]+=3;
	dfs(x+1);
	a[v]-=3;
	
	a[u]++;
	a[v]++;
	dfs(x+1);
	a[u]--;
	a[v]--;
}

void solve(){
	cin>>n>>m;
	for(int i = 1;i<=n;++i){
		cin>>a[i];
	}
	for(int i = 1;i<=m;++i){
		int u,v;
		cin>>u>>v;
		comp[i]={u,v};
	}
    ran = 100;
	dfs(1);
	cout<<ran<<"\n";
	/*
	for(int i = 1;i<=m;++i){
		if(comp[i].u==1||comp[i].v==1) cout<<comp[i].u<<" "<<comp[i].v<<"\n";
	}*/
}

signed main(){
    IOS;
    int t;
    cin>>t;
    while(t--){
    	solve();
    }
    return 0;
}

错误原因:题目说用贪心,结果就傻傻的相信,比赛的时候太蠢了,后来自己写,因为存比赛数据索引用的是1-m,但是一开始写dfs传的参数是0导致debug半小时。