貪心: 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、2、3、4、1、5的順序搬運

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