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 ", total ); } return 0; }