#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;
struct Home{ int dead;int score;}num[1001];
int cmp(const void *a,const void *b) //这个cmp函数的编写要会。用于确定排序的顺序
{
Home *aa=(Home *)a,*bb=(Home *)b; //强制转换成Home结构的指针,将其赋值给新的指针
if(aa->score != bb->score) //调用其中的score,在此决定升序还是降序
return bb->score-aa->score;
else
return aa->score-bb->score;
}
int main()
{
int T,sub,i,j,sum;
int a[1001];
cin>>T;
while (T--)
{
cin>>sub;
for (i=0;i<sub;i++) cin>>num[i].dead;
for (i=0;i<sub;i++) cin>>num[i].score;
qsort(num,sub,sizeof(num[0]),cmp); //第三个参数:各元素的占用空间大小
memset(a,0,sizeof(a)); //回顾此函数,第三个参数是将前多少个字节。
for (i=0,sum=0;i<sub;i++)
{
for (j=num[i].dead;j>0;j--)
{
if(a[j]==0)
{
a[j]=j;
break;
}
}
if(!j) sum+=num[i].score;
}
cout<<sum<<endl;
}
return 0;
}
此题,是一道典型的贪心问题,最主要的就是要知道,把截止日期就安排在最后一天,如果被安排了,就往前安排,如果到第一天还是被安排,则一定不能写了。
我一开始以为就是按照截止日期进行排序然后重复的就扣分,后来想想没那么简单,
此题还有一个关于cmp函数的问题。
1
2
3
4
|
intcomp(
const
void
*a,
const
void
*b)
{
return
*(
int
*)a-*(
int
*)b;
}
|
上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序。
以下为compare函数原型 //comp
compare( (void *) & elem1, (void *) & elem2 );
Compare 函数的返回值
|
描述
|
---|---|
< 0
|
elem1将被排在elem2前面
|
0
|
elem1 等于 elem2
|
> 0
|
elem1 将被排在elem2后面
|
简单来说,有一个数组 int a[100] ,要对从 a[0] 到 a[99] 的元素进行排序,只要写 sort(a,a+100) 就行了,
默认的排序方式是升序