hdu1789想法

it2022-05-09  18

其实这道题目自己学到了很多,首先刚看上体,自己有点晕,题目却是吧那些成为结构体的东西却竖着写了,然后自己懵了,然后自己便想将错就错,利用二维数组的性质他它输出,后来发现自己根本没有办法将第一行与第二行的共同点找出来,因为要输给不同的结构体当中的数,因此只能一行一行输入,当时认为这样太麻烦了,便看看了解题报告,发现很多人都是这样,因此,才这样的,然后第一行输入的是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


最新回复(0)