ADV-1181 搬運冰塊(貪心)


題目描述

問題描述
  丑楓接到了一份奇葩的工作:往冰庫里搬運冰塊.冰庫外放着N箱冰塊,由於室外溫度高,冰塊會很快融化,且每箱冰塊的融化速度不同.因為每箱冰塊的體積,質量不等,把每箱冰塊搬運進冰塊花費的時間也不同.因此需要合理安排搬運順序,才能使總的冰塊融化量最小.丑楓請你幫忙計算最少的總融化量是多少,以便匯報上司.
輸入格式
  第一行輸入整數N
  接下來N行,每行兩個整數,分別表示每箱冰塊的搬運耗時Ti及融化速度Di.
輸出格式
  輸出最少的總融化量
數據規模和約定
  2<=N<=100000,1<=Ti<=4000000,1<=Di<=100

樣例輸入

6
6 1
4 5
4 3
6 2
8 1
2 6

樣例輸出

86

(貪心) $O(nlogn)$

思考過程:

使用微擾法,考慮兩個冰塊的,v1t1+v2(t1+t2)<=v2t2+v1(t1+t2)時融化量最小。
即v2t1<=v1t2即可。估按此排序后計算即可。

C++ 代碼

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N=100010;

struct Ice
{
    int a;
    long long sum;
}ice[N];

bool cmpsum(Ice q,Ice p)
{
    if(q.sum*p.a < p.sum*q.a) return true;
    else return false;
}

int main()
{
    int n;
    cin>>n;
    long long m=0;
    for(int i=0;i<n;i++)
    {
        int a,sum;
        cin>>a>>sum;
        ice[i].a=a;
        ice[i].sum=sum;
    }
    
    sort(ice,ice+n,cmpsum);
    
    for(int i=0;i<n;i++)
    {
        m+=ice[i].sum;
        ice[i].sum=m;
    }
    long long res=0;
    
    for(int i=n-1;i>=1;i--)
    {
        res+=ice[i].a*ice[i-1].sum;
    }
    
    cout<<res<<endl;
    
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM