其他分享
首页 > 其他分享> > 中石油大学 11117 八目鳗 贪心 + 排序

中石油大学 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