1 条题解
-
0
当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
- 上传者