中石油大学 11117 八目鳗 贪心 + 排序
作者:互联网
米斯蒂娅去捕捉八目鳗为开店作准备。现在,她在一个有八目鳗的池塘边。她知道池塘里的有n条八目鳗,把第i条八目鳗从池塘弄回小店需要ti∗2个单位的时间(毕竟需要往返)。
这些八目鳗会自己吃P点!随着时间的推移,米斯琪把它们弄回来所消耗的体力与时间成正比,即在第t个时刻开始运第i条八目鳗所消耗的体力为t∗ci,其中,ci是给定的常数。一开始所有的八目鳗都没有P点,也就是说运送第一条八目鳗所消耗的体力为0。
米斯琪想知道把所有八目鳗运回小店所消耗的体力最少是多少。
输入
第一行输入一个整数n,表示八目鳗的数量。
接下来n行,每行包含两个整数ti,ci。
输出
一个整数,表示最少消耗的体力。
样例输入 Copy
6
3 1
2 5
2 3
3 2
4 1
1 6
样例输出 Copy
86
提示
对于10%的数据,n≤10,t≤100,ci≤10;
对于60%的数据,n≤1000,t≤20000,ci≤100;
对于100%的数据,n≤100000,t≤2000000,ci≤100。
这道题其实考的是经典的思考 + 排序。
首先我们对相邻的两个数进行一个分析, a1 , b1 , a2 , b2 是 前一个节点 和 后一个节点 的 a , b 。我们要做到局部最优解全局最优。我们进行一个分析。
n为前面已经分配的时间
n * b1 + (n + a1) * b2 <= n * b2 + (n + a2 ) * b1
a1* b2 <= a2 * b1;
这个已经满足了局部最优解解全局最优解,所以我们只需要对所有的a , b进行一个排序即可。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
struct Node{
int a , b ;
// n为前面已经分配的时间
// n * b1 + (n + a1) * b2 <= n * b2 + (n + a2 ) * b1
// a1* b2 <= a2 * b1;
bool operator<(Node &t){
return a * t.b < t.a * b;
}
} node[N] ;
int main(){
int n ;
scanf("%d", &n);
for(int i = 1 ; i <= n ; i++ ) scanf("%d%d",&node[i].a , &node[i].b) , node[i].a *= 2;
sort(node + 1 , node + n + 1);
long long sum = 0 ;
long long cnt = 0 ;
for(int i = 1 ; i <= n ; i++ )
{
sum +=(long long) cnt * node[i].b;
cnt += node[i].a;
}
cout << sum << endl;
}
标签:体力,ci,int,11117,b1,b2,石油大学,八目鳗 来源: https://blog.csdn.net/qq_52358098/article/details/117388778