斗鸡联赛一共有 n 只鸡参加,第i只鸡截至目前已经积了 ai 分。
接下来还有 m 场比赛要进行,第i场比赛的对阵双方是编号为 ui 和vi 的鸡。积分规则是:胜方加三分,败方不得分,若战平则双方各得一分。
请你计算在最好的情况下,我们的一号选手(炸鸡)能够排到第几名。
注意若有多鸡并列,则排名取并列的排名,且不影响随后的排名(例如两只鸡并列第二名,则都视为第二名,排名其后的下一只鸡视为第四名)。
输入
第一行包括一个整数T (1 ≤ T ≤ 100),样例组数。
对于每组样例:
第一行输入两个整数n,m(2 ≤ n ≤ 10,1 ≤ m ≤ 10),含义如题面所述。
第二行输入 n 个整数 (0 ≤ ai ≤ 100),表示第 i 只鸡当前已经有的积分。
接下来的 m 行,每行有两个正整数 (1 ≤ ui,vi ≤ n,ui ≠ vi),表示第 i 场比赛的对阵双方。
输出
对每组样例,输出一个整数表示一号选手最好的情况下能够排到第几名。
Input
3
4 3
2 4 5 8
1 2
1 4
2 4
3 1
3 1 1
2 3
6 6
1 2 3 4 5 6
2 3
2 3
3 4
4 5
5 6
6 1
Output
1
1
4
解析:
好好好,标题真好,还贪心!被骗了。
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
struct node
{
int x,y;
}str[25];
int n,m;
int ans,len;
int dx[3]={0,1,3};
int dy[3]={3,1,0};
int a[25];
void dfs(int u,int s)
{
if (u>=len)
{
int cnt=1;
for (int i=2;i<=n;i++)
{
if (a[i]>a[1]) cnt++;
}
ans=min(ans,cnt);
return ;
}
for (int i=s;i<len;i++)
{
int x=str[i].x,y=str[i].y;
for (int j=0;j<3;j++)
{
a[x] +=dx[j];
a[y] +=dy[j];
dfs(u+1,i+1);
a[x] -=dx[j];
a[y] -=dy[j];
}
}
}
void solve()
{
cin>>n>>m;
for (int i=1;i<=20;i++) a[i]=0;
for (int i=1;i<=n;i++) cin>>a[i];
len=0;
for (int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
if (x==1||y==1) a[1] +=3;
else str[len++]={x,y};
}
ans=n;
dfs(0,0);
cout<<ans<<endl;
}
signed main()
{
ios;
int T=1;
cin>>T;
while (T--) solve();
return 0;
}