其实这道题目自己学到了很多,首先刚看上体,自己有点晕,题目却是吧那些成为结构体的东西却竖着写了,然后自己懵了,然后自己便想将错就错,利用二维数组的性质他它输出,后来发现自己根本没有办法将第一行与第二行的共同点找出来,因为要输给不同的结构体当中的数,因此只能一行一行输入,当时认为这样太麻烦了,便看看了解题报告,发现很多人都是这样,因此,才这样的,然后第一行输入的是deadline,第二行数score,然后就是排序了,当时想这下可怎么排序呀,原来都是一行一组,现在是一列一组,然后便想按照往常的方法,试一试,没想到,最终却是正确答案,只是输出的格式有些不同而已,而以往都是横着写的输出格式,这下只是变成了竖着写,而此时我明白了,其实在计算机里面,没有横着写,竖着写,这一说,都是按照输出模式来看的,怎么输出就怎么写,根本就没那回事,因此这个只与输出格式有关不是你自己所想象的,然后第三个门槛,自己一直想自己应该怎么写可以让他们按照题目中说的写呢,其实看了解题报告才知道,他们是利用一个变量,是通过这个变量,如果访问过了,就是1,没有访问不过就是0,如果这一天已经使用过,那么就让他减,直到找到某一天没有访问过的某一天,如果均都访问过,则是要与sum相加,主要思路就是这样,但是我发现,如果按照这个思路是不行针对我之前写的代码,因为针对第三种情况,那样结果只是7因为第一天3没有除去,这时翻了其他的解题报告,发现都是这样做的,此时不知道为什么,这时我发现是自己排序和别人的不一样,也就是开始的思路,有问题,我的思路的排序是先按照deadline从小到大的顺序,然后score按照大到小的顺序走,发现别人的是先按照score大到小的顺序走的,然后按照deadline的小到大顺序,此时我想了想,又查找解题报告,发现我那种的思路很麻烦,别人的思路解题方法很简单,代码实现很少,效率更高,因此总结出,题目中是看中的是score,因此是以score为主,先排序的,因此这点要注意了,因此是按照他先排序的,也就这么多了
#include <stdio.h> #include <stdlib.h> struct mu { int d; int s; }p[1000]; int cmp(const void *a,const void *b) { struct mu *m=(struct mu *)a; struct mu *n=(struct mu *)b; if(m->s!=n->s) return n->s-m->s; else return m->d-n->d; } int main() { int t,n,i,num,j,sum,flag[1000]; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&p[i].d); for(i=0;i<n;i++) scanf("%d",&p[i].s); memset(flag,0,1000); qsort(p,n,sizeof(p[0]),cmp); sum=0; for(i=0;i<n;i++) { for(j=p[i].d;j>0;j--) { if(flag[j]==0) { flag[j]=1; break; } } if(j==0) sum+=p[i].s; } printf("%d\n",sum); } return 0; }
转载于:https://www.cnblogs.com/yelcoved/archive/2013/02/04/2892075.html
