首页 » Program » C/C++ » 正文

hdu2015新生赛1008

这题wa了好多次,re了好多次,最后自己还是没有ac,仅放上wa代码记录本次的耻辱!(思路没问题,就是先把朋友推荐项目减完,再置0,如果钱<0就-1,=0就输出朋友推荐项目数,>0再玩剩下的项目,这时候对所有项目的钱进行小到大排序,一直减到小明的钱<0就输出count,我怀疑是快排那里出了问题,我是从1下标开始的……..)

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *p1,const void *p2)   //比较函数
{
    return (*(int*)p1 - *(int*)p2);
}

int main()
{
    __int64 t,i,j,u,m,n,count1;
    __int64 k;
    scanf("%I64d",&t);
    while (t--)
        {
            __int64 happymoney[10005];   //钱数组
            int rcmd[10005] = {0};   //朋友推荐的项目
            scanf("%I64d%I64d%I64d",&n,&m,&k);
            for (i=1; i<=n; i++)
                {
                    scanf("%I64d",&happymoney[i]);   //每个项目的钱
                }
            for (j=1; j<=m; j++)
                {
                    scanf("%d",&rcmd[j]);
                    k = k - happymoney[rcmd[j]];   //小明的钱-朋友推荐项目的钱
                    happymoney[rcmd[j]] = 0;   //朋友推荐项目的钱置0,方便后面排序
                }
            if (k<0) printf("-1\n");  //连朋友推荐项目都玩不完
            else
                {
                    if (k==0) printf("%I64d\n",m);  //刚好玩光朋友推荐项目
                    else                       //剩下的钱还大于0
                        {
                            qsort(happymoney,n,sizeof(happymoney[1]),cmp);   //对非朋友推荐项目的钱小到大排序
                            count1 = m;
                            for (u=m+1; u<=n; u++) //从第一个最少钱的非朋友推荐项目开始循环
                                {
                                    k = k - happymoney[u];
                                    if (k<0) break;  //玩不了这个项目,跳出循环
                                    count1++;   //这个项目可以玩
                                }
                            printf("%I64d\n",count1);   //打印可以玩的总项目数目
                        }
                }
        }
    return 0;
}

仅供参考!

赞 (0)

Comment