hdu1789想法

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

 

 

 

 

posted on 2013-02-04 17:24  yelcoved  阅读(478)  评论(0)    收藏  举报