本文主要是介绍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 还是利用率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!