护花
Description
FJ出去砍木材去了,把N(2<=N<=100,000)頭牛留在家中吃草,當他回來的時候,發現奶牛們都跑到花園里吃花去了,為了減少損失,FJ打算把牛移到牛棚中去。
每頭牛的位置離牛棚需要Ti分鐘(1<=Ti<=2,000,000),而且在等待被移走的過程中,每分鐘破壞Di(1<=Di<=100)朵花,無論多么努力FJ一次只能移動一只奶牛,移動一只奶牛到牛棚需要2×Ti分鐘(來回各一次)。
寫一個程序安排移動順序使得損失的花最少。
Input
第1行輸入一個整數N
第2到N+1行每行包含兩個整數Ti和Di
Output
輸出一個整數表示最少損失的花的數量
Sample Input
6
3 1
2 5
2 3
3 2
4 1
1 6
Sample Output
86
Data Constraint
Hint
【樣例說明】
FJ按照6、2、3、4、1、5的順序移走奶牛
.
.
.
.
.
.
分析
設:
第一頭牛時間為a,價格為b
第二頭牛時間為c,價格為d,
則必有2ad<<2bc
ad < bc
a < bc/d
a/b < c/d
多頭牛同理
所以把時間/價格從小到大排序即可
.
.
.
.
.
程序:
#include<iostream> using namespace std; int n; unsigned long long ans,s; int t[100001],d[100001]; float a[100001];void kp(int l,int r) {if (l>=r) return;int i=l,j=r;double mid=a[(l+r)/2];do{while (a[i]<mid) i++;while (a[j]>mid) j--;if (i<=j){a[0]=a[i];a[i]=a[j];a[j]=a[0];t[0]=t[i];t[i]=t[j];t[j]=t[0];d[0]=d[i];d[i]=d[j];d[j]=d[0];i++;j--;}}while (i<=j);kp(l,j);kp(i,r); }int main() {cin>>n;for (int i=1;i<=n;i++){cin>>t[i]>>d[i];a[i]=(float)t[i]/d[i];}kp(1,n);for (int i=1;i<=n;i++){ans+=s*d[i];s+=t[i]*2;}cout<<ans;return 0; }轉載于:https://www.cnblogs.com/YYC-0304/p/9499956.html
總結
- 上一篇: 最短路上的统计(Floyd)
- 下一篇: 最高的奶牛