题意:有N个盒子,每个盒子上面可以放xi个盒子。问最少分几堆。
思路:xi从小到大贪心,最终得到最少几堆能放下,一开始我想的思路是xi从大到小贪心,后来验证思路错了。
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
int n, i, j, a[100], tmp, flag;
while(~scanf("%d", &n))
{
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(a[0]), cmp);
for(i = flag = 0; i < n; i++)
{
if(a[i] != -1)
{
tmp = 1;
for(j = i + 1; j < n; j++)
{
if(a[j] >= tmp && a[j] != -1)
{
tmp++;
a[j] = -1;
}
}
flag++;
}
}
printf("%d\n", flag);
}
return 0;
}
本文探讨了一个关于盒子堆放的问题,通过贪心算法求解最少分成几堆的问题。采用从小到大的顺序进行贪心选择,确保了算法的有效性和正确性。
413

被折叠的 条评论
为什么被折叠?



