标签:des style os io for ar div amp sp
题意 有n个题目 完成第i个题目需要的时间为e[i] 第i个题目的系数为k[i] 你可以按任意顺序完成题目 比赛开始到完成第i个题目消耗的总时间为t[i] 那么完成第i个题目要扣掉k[i]*t[i]分 求完成所有题目至少扣多少分
考虑任意相邻两题i,j 改变i,j时 i,j之前和之后所有的题目对结果都没有影响 只是i,j两题的扣分和由原来的(t+e[i])*k[i]+(t+e[i]+e[j])*k[j]变成了(t+e[i]+e[j])*k[i]+(t+e[j])*k[j]
比较可以发现只是e[i]*k[j]变成了e[j]*k[i] 所以 若e[i]*k[j]<e[j]*k[i] 那么i就应该在j之前完成 以此进行排序即可
<span style="font-size:14px;">#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100050;
ll k[N], o[N], t[N], e[N], n;
bool cmp (int i, int j)
{
return (e[i] * k[j] < e[j] * k[i]);
}
int main()
{
while (scanf ("%I64d", &n) != EOF)
{
for (int i = 1; i <= n; ++i)
scanf ("%I64d", &e[i]);
for (int i = 1; i <= n; ++i)
{
o[i] = i;
scanf ("%I64d", &k[i]);
}
sort (o + 1, o + n + 1, cmp);
ll ans=0;
for (int i = 1; i <= n; ++i)
{
int j=o[i];
t[j]=t[o[i-1]]+e[j];
ans += k[j] * t[j];
}
printf ("%I64d\n", ans);
}
return 0;
} </span>
3 10 10 20 1 2 3
150
HDU 4882 ZCC Loves Codefires(贪心)
标签:des style os io for ar div amp sp
原文地址:http://blog.csdn.net/acvay/article/details/38866315