题意是:给一些课程,以及复习这些课程的时间和不能完成扣的价值, 求最小价值,每天只能完成一科。
贪心思想就是按照最大价值的排序,如果这个时间没安排课程,就让这门课在这,如果已经有,就在这之前安排在空位上,
代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct ss
{
int val;
int day;
}a[1002];
int vis[1002];
bool cmp(ss t1,ss t2)
{
if(t1.val==t2.val)
return t1.day<t2.day;
return t1.val>t2.val;
}
int main()
{
int i,n,ncase;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i].day);
for(i=0;i<n;i++)
scanf("%d",&a[i].val);
memset(vis,0,sizeof(vis));
sort(a,a+n,cmp);
int sum=0;
for(i=0;i<n;i++)
{
int flag=0;
if(vis[a[i].day]) //安排在这个时间之前的第一个空位。
{
int m=a[i].day;
m--;
while(m>0)
{
if(!vis[m]) { vis[m]=1;flag=1;break;}
m--;
}
if(!flag) sum+=a[i].val;
}
else vis[a[i].day]=1;
}
printf("%d\n",sum);
}
return 0;
}