ABC F求调
  • 板块学术版
  • 楼主code_hyx
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/8/24 21:56
  • 上次更新2024/8/25 09:57:03
查看原帖
ABC F求调
530797
code_hyx楼主2024/8/24 21:56

我的思路:记录下每个数理论最多操作次数,记录为一个数组,操作转化为在这个数组里选一个数减去任意。 必胜策略是永远使这个数组的和为偶数,直到只剩0和1。 代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[200005],b[200005],sum=0,op=1;
bool cmp(int x,int y)
{
	return x>y;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]==1)
		{
			b[i]=0;
			continue;
		}
		int m=a[i],cnt=0;
		for(int j=2;j*j<=a[i];j++)
		{
			while(m%j==0)
			{
				cnt++;
				m=m/j;
			}
		}
		if(m>1)cnt++;
		b[i]=cnt;
		sum+=b[i];
	}
	sort(b+1,b+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		//cout<<b[i]<<" ";
		if(sum%2==0)//去一个偶数 
		{
			if(b[i]<=1)op=3-op;
			sum-=b[i]/2*2;
			b[i]-=b[i]/2*2;
		}
		else//去一个奇数 
		{
			if(b[i]/2*2+1<=b[i])
			{
				if(b[i]<=0)op=3-op;
				sum-=b[i]/2*2+1;
				b[i]-=b[i]/2*2+1;
			}
			else
			{
				if(b[i]<=0)op=3-op;
				sum-=b[i]/2*2-1;
				b[i]-=b[i]/2*2-1;
			}
		}
		//cout<<b[i]<<"\n";
		op=3-op;//换人 
	}
	if(op==1)cout<<"Bruno";//2会赢
	if(op==2)cout<<"Anna";//1会赢
	return 0;
}
2024/8/24 21:56
加载中...