hihocoder-1820-切割木棒
#1820 : 切割木棒
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi有N根木棒,其中第i根的长度是Li。
现在小Hi会进行多轮切割,每轮行动中小Hi会选出其中最短的木棒,不妨设其长度为X。然后将所有长度为X的木棒移除。再将剩余的木棒都切掉X长度。如此反复直到木棒一根也不剩。
例如一开始木棒的长度是[2, 1, 3, 1],则第一轮之后1被移除,余下的又被切短为:[1, 2];第二轮之后余下的是[1];第三轮之后就一根也不剩了。
给定N根木棒,请你计算每轮切割过后,剩余木棒的长度之和是多少。
输入
第一行包含一个整数N。
第二行包含N个整数,L1, L2, L3, ... LN。
对于50%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000 1 ≤ Li ≤ 1000000
输出
输出每轮之后剩余木棒的长度
-
样例输入
-
4 2 1 3 1
样例输出
-
3 1 0
题解:
模拟题,按照题意来写代码逻辑即可。
#include <cstdio>
#include <cstdlib>
const int MAXN = 100000 + 10;
int n;
int num[MAXN];
int cmp(const void *a, const void *b)
{
return (*(int *)a - *(int *)b);
}
int main(){
scanf("%d", &n);
long long total = 0;
for(int i=0; i<n; ++i)
{
scanf("%d", &num[i]);
total += num[i];
}
qsort(num, n, sizeof(int), cmp);
int idx = 0, pre = 0;
while(idx < n)
{
total -= ((num[idx]- pre)*(n - idx));
pre = num[idx];
++idx;
while(idx < n && num[idx] == num[idx-1])
{
idx++;
}
printf("%lld\n", total );
}
return 0;
}