给你n个任务,每个任务有两个权值,t[i],b[i],前面的是完成任务所需时间,后面的那个是个参数,每个任务完成的代价是完成当前任务总时间(之前的+现在的)
sumt * b[i],问你完成所有任务的总花费最小是多少。
思路:
水贪心吧,不给证明了,没啥意思,就想象一下,那个东西价值贵就先干那个就行了
价值等于 b[i] / t[i],价值贵的放到最后干会吃亏的。
#include<stdio.h> #include<algorithm> using namespace std; typedef struct { __int64 x ,y; double key; }NODE; bool camp(NODE a ,NODE b) { return a.key > b.key; } NODE node[110000]; int main () { int n ,i; while(~scanf("%d" ,&n)) { for(i = 1 ;i <= n ;i ++) scanf("%I64d" ,&node[i].x); for(i = 1 ;i <= n ;i ++) { scanf("%I64d" ,&node[i].y); node[i].key = node[i].y * 1.0 / node[i].x; } sort(node + 1 ,node + n + 1 ,camp); __int64 sum = 0 ,ans = 0; for(i = 1 ;i <= n ;i ++) { sum += node[i].x; ans += sum * node[i].y; } printf("%I64d " ,ans); } return 0; }