题目描述
输入
输出
这题最坑爹的不是贪心算法,而是那个连T都是多组输入;坑到死;
算了,这个方法来自同学的讲解自己写了一下,错了好多遍(g++)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct home
{
int day;
int fen;
} s[1002];
int cmp(const void*a,const void*b)
{
return ((home*)b)->fen-((home*)a)->fen;
}
int main()
{
int a,t,n,i,bj[1002],sum;
while(~scanf("%d",&t))
{
while(t--)
{
sum=0;
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d",&s[i].day);
for(i=0; i<n; i++)
scanf("%d",&s[i].fen);
qsort(s,n,sizeof(home),cmp);//按分数排序,不会的可以换成冒泡之类的
memset(bj,0,sizeof(bj));//将标记数组置0;不会的用for循环;
for(i=0; i<n; i++)
{
a=s[i].day;
if(bj[a]==0)//判断这一天是否用过;
bj[a]=1;//没用过就用
else//用过就向前找天数,因为按分数从高到低排,所以占用前面的也是赚分
while(a>0)
{
if(bj[a])
a--;
else
{
bj[a]=1;
break;
}
}
if(a==0)//向前找到0还没找到,说明只能不做了,所以扣分(sum)就要增加一点(s[i].fen)了
sum+=s[i].fen;
}
printf("%d\n",sum);
}
}
return 0;
}