题目链接
这道题被放在DP里,导致我想了很久怎么用DP去完成。后来实在想不出来,搜了题解。与其说是DP不如说是贪心吧。
排序,将权值大的放在前面,如果权值相同,时间早的放前面。定义一个标记数组,储存每一天是否有作业写过。然后依次遍历每个结构体之前的时间,看有没有时间,能够写这一天的作业。由于排序,所以得到的一定就是最优解。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1E3+5;
const int INF=0x3f3f3f3f;
bool vis[maxn];
struct node
{
int score,day;
}qwe[maxn];
bool cmp (node a,node b)
{
if (a.score==b.score)
return a.day<b.day;
else
return a.score>b.score;
}
int main ()
{
int t,n,ans;
scanf ("%d",&t);
while (t--)
{
ans=0;
scanf ("%d",&n);
memset(vis,false, sizeof(vis));
for (int i=1;i<=n;i++)
scanf ("%d",&qwe[i].day);
for (int i=1;i<=n;i++)
scanf ("%d",&qwe[i].score);
sort(qwe+1,qwe+1+n,cmp);
for (int i=1;i<=n;i++)
for (int j=qwe[i].day;j>=1;j--)
{
if (vis[j]==false)
{
vis[j]=true;
break;
}
if (j==1)
ans+=qwe[i].score;
}
printf ("%d\n",ans);
}
return 0;
}