zoukankan      html  css  js  c++  java
  • ZZUOJ 10510: 石子合并

    题目链接http://acm.zzu.edu.cn:8000/problem.php?id=10510

    题目大意:N堆石子,每次可以合并任意两堆,每次合并的花费是两堆中重量最小的一个。问最小花费和最大花费。

    解题思路:假如有三堆石子a1, a2, a3 从小到大排列,那么会发现每次选择最大的两个合并最终的花费为a1+a2,并且这是最小的。对于最大花费来说,由于每次合并代价是重量最小的,所以我们选择每次合并重量最小的两堆,这样就能使花费最大。

    代码:

     1 typedef long long ll;
     2 const int maxn = 1e5 + 5; 
     3 int n;
     4 ll a[maxn];
     5 priority_queue<ll, vector<ll>, greater<ll> > q;
     6  
     7 void solve(){
     8     sort(a, a + n);
     9     ll ans1 = 0, ans2 = 0;
    10     for(int i = 0; i < n - 1; i++) {
    11         ans1 += a[i];
    12         q.push(a[i]);
    13     }
    14     q.push(a[n - 1]);
    15     while(q.size() > 1){
    16         ll u = q.top(); q.pop();
    17         ll v = q.top(); q.pop();
    18         ans2 += min(u, v);
    19         q.push(u + v);
    20     }
    21      
    22     printf("%lld %lld
    ", ans1, ans2);
    23 }
    24 int main(){
    25     scanf("%d", &n);
    26     for(int i = 0; i < n; i++) scanf("%lld", a + i);
    27     solve();
    28 }

    题目:

    10510: 石子合并

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 48  Solved: 12
    [Submit][Status][Web Board]

    Description

    聪明 和 不聪明 要合并n堆石子使之成为一堆,他们每次只能合并其中的两堆石子,合并石子的体力花费是两堆石子质量中的较小值,即min(ai,aj),聪明 很聪明,他可以花费最少体力来把石子合并成一堆,不聪明 比较无脑,在合并石子的时候不会考虑很多,现在希望你能求出 聪明 合并这n堆石子的花费,以及 不聪明 在最坏情况下合并这n堆石子的体力花费。

    Input

    第一行一个整数n  (1<=n<=10^5)
    第二行n个整数,表示a1 a2 ... An. (1<=ai<=10^6)

    Output

    输出一行两个整数x y,x为聪明的花费,y为不聪明最坏情况下的花费。

    Sample Input

    4
    1 1 2 3
    

    Sample Output

    4 6

    HINT

     

    Source

    JXD

  • 相关阅读:
    TF400916错误修复办法
    架构优化
    .net 动态代理的泛型方法支持问题
    解决Kafka-1194问题
    SOA服务总线设计
    SOA初探
    重构心法——提高代码复用率
    重构心法——拆分大对象
    重构心法——你应该这样写方法
    反爬虫那些事儿
  • 原文地址:https://www.cnblogs.com/bolderic/p/7497180.html
Copyright © 2011-2022 走看看