1. 程式人生 > 其它 >藍橋杯--搬運冰塊--(貪心)

藍橋杯--搬運冰塊--(貪心)

貪心: 2個的個例的優先順序 決定了整個數列的優先順序 喵喵喵

試題 演算法提高 搬運冰塊
     
資源限制
時間限制:1.0s   記憶體限制:256.0MB
問題描述
  醜楓接到了一份奇葩的工作:往冰庫裡搬運冰塊.冰庫外放著N箱冰塊,由於室外溫度高,冰塊會很快融化,且每箱冰塊的融化速度不同.因為每箱冰塊的體積,質量不等,把每箱冰塊搬運進冰塊花費的時間也不同.因此需要合理安排搬運順序,才能使總的冰塊融化量最小.醜楓請你幫忙計算最少的總融化量是多少,以便彙報上司.
輸入格式
  第一行輸入整數N
  接下來N行,每行兩個整數,分別表示每箱冰塊的搬運耗時Ti及融化速度Di.
輸出格式
  輸出最少的總融化量
樣例輸入
6 6 1 4 5 4 3 6 2 8 1 2 6 樣例輸出 86 資料規模和約定   2<=N<=100000,1<=Ti<=4000000,1<=Di<=100 樣例說明   按照6、2341、5的順序搬運
View problem
#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define M 100005

template <class G> void read(G &x)
{
    x=0;int f=0;char ch=getchar();
    
while(ch<'0'||ch>'9'){f|=(ch=='-');ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } struct dian{ int t,d; }p[M]; bool cmp(dian a,dian b) { return a.t*b.d<b.t*a.d; } int n,m; int main(){ read(n);
long long mx=0; for(ri i=1;i<=n;i++) { read(p[i].t);read(p[i].d); mx+=p[i].d; } sort(p+1,p+1+n,cmp); long long ans=0; for(ri i=1;i<=n;i++) { mx-=p[i].d; ans+=(mx*p[i].t); } printf("%lld",ans); return 0; }
View Code