hihocoder-1820-切割木棒

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; 
}  

 

猜你喜欢

转载自www.cnblogs.com/zhang-yd/p/9652387.html