HDU 4882 ZCC Loves Codefires 还是利用率

题意:给你两组数,a[],b[],设suma是a[i]的前i项,包括第i项的和。

问你sum=求和(suma*b[i])i=1,2,3,……n的最小值,这里的顺序可以不是原数组的顺序。(我感觉我没说明白,我都听不懂了)

学长的题意:给你n个任务,每个任务有两个权值,t[i],b[i],前面的是完成任务所需时间,后面的那个是个参数,每个任务完成的代价是完成当前任务总时间(之前的+现在的)sumt * b[i],问你完成所有任务的总花费最小是多少。


想法:一看就是贪心,再一看又是利用率,之前被坑过所以长记性。

rate=b[i]/t[i],表示我花费b[i]用到的时间率,如果rate小,则表示b[i]受时间的影响就会小了。那么就可以把它放在后面,也就是suma更大的地方,反正它受suma的影响是目前最小的啊,这样就局部最优了。


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
struct node
{
	int tim,cot;
	double rate;
}e[100000+5];
bool cmp(node a,node b)
{
	return a.rate<b.rate;
}
void Input()
{
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&e[i].tim);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&e[i].cot);
	} 
	for(int i=1;i<=n;i++)
	{
		e[i].rate=e[i].tim*1.0/e[i].cot;
	}
}
void treatment()
{
	sort(e+1,e+n+1,cmp);
	__int64 sum=0,res=0;
	for(int i=1;i<=n;i++)
	{
		sum+=e[i].tim;
		res+=sum*e[i].cot;
	}
	printf("%I64d\n",res);
} 
int main()
{
	while(~scanf("%d",&n))
	{
		Input();
		treatment();
	}
	return 0;
} 




你可能感兴趣的:(HDU 4882 ZCC Loves Codefires 还是利用率)