zoukankan      html  css  js  c++  java
  • [HAOI2009] 巧克力

    有一个 (n imes m) 的矩形巧克力,沿着第 (i) 条横线切一次代价为 (a_i),沿着第 (i) 条竖线切一次代价为 (b_i),求切割完的最小代价。

    Solution

    显然对于相同方向的,我们会先切大的再切小的

    对于不同类型的,设已经横切 (x) 次,纵切 (y) 次,那么先切横的代价就是 ((s_1+1)a+(s_2+2)b),反之则为 ((s_1+2)a+(s_2+1)b),若前者大于后者,等价于 (b>a),于是我们发现切割顺序与方向无关,只需要先切大的就可以了

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 20005;
    
    struct item {
        int p,q;
        bool operator < (const item &b) {
            return p > b.p;
        }
    } s[N];
    
    int n,m,a[N],b[N];
    
    signed main() {
        cin>>n>>m;
        for(int i=1;i<n;i++) cin>>a[i], s[i]={a[i],1};
        for(int i=1;i<m;i++) cin>>b[i], s[i+n-1]={b[i],2};
        int s1=0,s2=0,ans=0;
        sort(s+1,s+n+m-1);
        for(int i=1;i<=n+m-2;i++) {
            if(s[i].q==1) {
                ans+=s[i].p*(s2+1);
                ++s1;
            }
            else {
                ans+=s[i].p*(s1+1);
                ++s2;
            }
        }
        cout<<ans;
    }
    
    
  • 相关阅读:
    软件工程概论课后作业2
    第三周进度表
    软件工程概论课后作业1
    第二周进度表
    9.异常处理
    《构建之法》阅读笔记二
    《构建之法》阅读笔记一
    第五周进度表
    软件工程个人作业03
    第四周进度表
  • 原文地址:https://www.cnblogs.com/mollnn/p/12392975.html
Copyright © 2011-2022 走看看