这题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; }
仅供参考!