贪心算法,时间按从小到大排序,时间相同按分数从小到大排序
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct sa
{
int x; //天数
int y; //分数
} data[1000];
int cmp(const sa &a,const sa &b)
{
if(a.x==b.x) //当天数一样按分数从大到小排
return a.y>b.y;
return a.x<b.x;
}
int flag[1000];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
memset(flag,-1,sizeof(flag));
int reduce=0;
int ss;
scanf("%d",&ss);
for(int j=0; j<ss; j++)
{
scanf("%d",&data[j].x);//天数
}
for(int k=0; k<ss; k++)
{
scanf("%d",&data[k].y); //分数
}
sort(data,data+ss,cmp);
int day=1;
for(int m=0; m<ss; m++)
{
if(day>data[m].x)
{
int min_tian=data[m].x;
int min_fen=data[m].y;
int min_f=m;
for(int i=0; i<m; i++)
{
if(flag[i]!=-1&&min_tian>=flag[i]&&min_fen>data[i].y)
{
min_fen=data[i].y;
min_f=i;
}
}
flag[m]=flag[min_f];
flag[min_f]=-1;
}
else if(day<=data[m].x)
{
flag[m]=day;
day++;
}
}
for(int z=0; z<ss; z++)
{
if(flag[z]==-1)
reduce=reduce+data[z].y;
}
printf("%d\n",reduce);
}
return 0;
}
/*
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 4 1 7 6 5 4
*/