题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2319
题意:t组数据,n个项目,每个项目A可以得到ai的权,B可以得到bi的权,轮流选择,A先选,A固定会选剩余项目中ai最大的那个权,问B如果足够聪明,最少能保证得到多少。
思路:先排序,按ai排序,从大到小,相等时bi也是从大到小。因为ai先选,也就是保证前面的A的选择个数不比B少,
dp【i】【j】i表示当前到第i个项目,j表示A选了j个项目
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct node
{
long long x,y;
long long operator < (const node _a)const
{
if(_a.x==x)
return _a.y<y;
return _a.x<x;
}
}A[1010];
long long t,n;
long long dp[1010][1010];
int main()
{
for(scanf("%lld",&t);t;t--)
{
scanf("%lld",&n);
for(long long i=1;i<=n;i++) scanf("%lld",&A[i].x);
for(long long i=1;i<=n;i++) scanf("%lld",&A[i].y);
sort(A+1,A+n+1);
long long m=(n+1)/2;
for(long long i=1;i<=n;i++)
{
for(long long j=(i+1)/2;j<=min(i,m);j++)
{
dp[i][j]=dp[i-1][j-1];
if(j>=i-j&&i!=j)dp[i][j]=max(dp[i][j],dp[i-1][j]+A[i].y);
}
}
printf("%lld\n",dp[n][m]);
}
}