BNU程序设计大赛就要开始了,决赛地点暂时定在电子楼,因为电子楼有很多各种大小的机房,目前估计参赛的队伍总数为n,但是学校可能没有那么大的机房容纳所有队伍,可能要将选手分配在几个小机房中进行比赛,xyjian老大安排你去选机房,为了让比赛选手相对集中,要求选中机房的总数最少,另外在满足这一前提的情况下尽可能选择较大的机房。现在你得到了BNU所有机房的能容纳队伍数目的情况表,请你编程自动选择机房。
Input
输入文件包含多组数据。
文件第一行:一个正整数t<=20表示测试数据的组数。
接下来t行表示t组数据,每组数据按照以下格式:
第一行两个正整数n<=100000和k<=1000以空格隔开,表示参赛队的总数和可以选择的机房总数k。
接下来k行每行一个正整数c<=20000。
第1行表示1号机房所能容纳的队伍总数,第2行表示2号机房能容纳的队伍数,以此类推,已知所有k个机房的大小均不相同,并且所有机房的总容量大于n。
Output
对每组数据输出所要选择的机房的编号,每个编号一行,从小到大输出,每组数据后请输出一个空行。
Sample Input
2 200 2 300 400 100 5 50 4 20 40 5
Sample Output
2 1 3 4
最好用结构体储存数据
把机房按容量排序,优先选大的。 最后再给选定的机房按编号排序
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int c; //容量
int s; //编号
}ct;
ct site[1005] ;
int comp(void const * a,void const *b)
{
return (*(ct *)b).c-(*(ct *)a).c;
}
int cmp(void const * a,void const *b)
{
return *(int *)a-*(int *)b;
}
int a[1005];
int main()
{
int t;
int i;
int n,k;
int j;
int sum;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d%d",&n,&k);
for (i=0;i<k;i++)
{
scanf("%d",&site[i].c);
site[i].s=i+1;
}
qsort(site,k,sizeof(ct),comp);
for (j=0,i=0;i<k;i++)
{
if(sum<n)
{
sum+=site[i].c;
a[j]=site[i].s;
j++;
}
else
break;
}
qsort(a,i,sizeof(int),cmp);
for (j=0;j<i;j++)
printf("%d\n",a[j]);
printf("\n");
}
return 0;
}