开始思路是 从最后一天开始依次找每天最大分数,
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=1010;
struct Node{
int d,s;
}node[MAXN];
bool used[10000];
bool cmp(Node a,Node b){
if(a.d==b.d) return a.s<b.s;
return a.d<b.d;
}
int main()
{
int T,n,j;
scanf("%d",&T);
while(T--)
{
int ans=0,s=0;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&node[i].d);
for(int i=0;i<n;i++) scanf("%d",&node[i].s),ans+=node[i].s;
sort(node,node+n,cmp);
memset(used,false,sizeof(used));
for(int i=n-1;i>=0;i--)
{
int maxx=0,maxj=-1;
for(j=i;j<n;j++){
if(!used[j]&&node[j].s>maxx&&node[j].d>i){
maxx=node[j].s;maxj=j;
}
}//printf("%d %d\n",maxx,maxj);
s+=maxx;used[maxj]=true;
}
printf("%d\n",ans-s);
}
return 0;
}
后来思路先按分数排,每天剔除最大的。
最后的最优解。
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=1010;
struct Node
{
int d,s;
}node[MAXN];
bool used[10000];
bool cmp(Node a,Node b)
{
if(a.s==b.s)
{
return a.d<b.d;
}
return a.s>b.s;
}
int main()
{
int T,n,j;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&node[i].d);
for(int i=0;i<n;i++) scanf("%d",&node[i].s);
sort(node,node+n,cmp);
memset(used,false,sizeof(used));
int ans=0;
for(int i=0;i<n;i++)
{
for(j=node[i].d;j>0;j--){
if(!used[j]){
used[j]=true;
break;
}
}//printf("%d\n",j);
if(j==0)
ans+=node[i].s;
}
printf("%d\n",ans);
}
return 0;
}