1 条题解

  • 0
    @ 2024-11-26 20:13:37

    当m>100时,可以得出最终的权值为0。 所以只需要考虑m<=100,可以考虑暴力,但2^100^会超时,所以需要剪枝。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e4+10;
    int n,m;
    long long a[N],k[N];//不开long long 会死
    long long sum,sum1,sum2;
    long long su(long long a[],int n)
    {
    	long long res=0;
    	for(int i=1;i<=n;i++)
    		res+=a[i];
    	return res;
    }
    long long dp(int dep,long long a[],int n)//不要在意名字
    {
    	if(n==0)return 0ll;//会缩短很大的时间
    	if(dep==m+1)return su(a,n);
    	long long b[N],c[N],bn=0,cn=0;
    	for(int i=1;i<=n;i++)//根据题目将数组分成包含和不包含两个数组
    		if(a[i]%k[dep]==0)
    			b[++bn]=a[i];
    		else c[++cn]=a[i];
    	if(dep&1) return min(dp(dep+1,b,bn),dp(dep+1,c,cn));//Alice
    	else return max(dp(dep+1,b,bn),dp(dep+1,c,cn));//Bob
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		cin>>a[i];
    	if(m>100)
    	{
    		cout<<0<<endl;
    		return 0;
    	}
    	for(int i=1;i<=m;i++)
    	{
    		cin>>k[i];
    	}
    	cout<<dp(1,a,n)<<endl;
    	return 0;
    }
    
    

    信息

    ID
    162
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    116
    已通过
    16
    上传者