云计算
题目描述
技术产业革命的春风也吹到了广西大学,我们的创新创业项目渐渐有了拥抱云计算的意识,各大ECS厂商1元/月的学生机被团队们广泛采购并商业化使用,这就是一个很好的栗子。
我们都知道,云计算是将计算运行在别的地方,正如我们接下来的问题需要将困难的问题转移到让聪明的你来解决一样。
现在有nnn个三元组(a,b,c)(a,b,c)(a,b,c),你需要将他们以任意顺序安排在一个一维数组里,假设数组下标以111开始,对于一个你安排好之后的数列,我们定义他的价值是:
∑i=1n[ai(i+1)+bi(n−i)+ci(i+2)]\sum ^{n}_{i=1}[ a_i(i+1) +b_i(n-i)+c_i(i+2)]∑i=1n[a**i(i+1)+b**i(n−i)+c**i(i+2)]
请问这个数列所有可能中,他最小价值应该是多少?
输入
3
3 2 2
2 4 3
6 1 3
输出
65
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=1e5+10;
struct node
{
int a,b,c;
} num[N];
bool cmp(node a,node b)
{
return a.a-a.b+a.c>b.a-b.b+b.c;
}
int main()
{
int n;
ll ans=0;
cin>>n;
for(int i=1; i<=n; i++)
cin>>num[i].a>>num[i].b>>num[i].c;
sort(num+1,num+n+1,cmp);
for(int i=1; i<=n; i++)
{
ans+=num[i].a*(i+1)+num[i].b*(n-i)+num[i].c*(i+2);
}
cout<<ans<<endl;
return 0;
}
思路
贪心。
将两组数据比较就🙃
例如:
x(1+1)+y(n-1)+c(1+2)+xx(2+1)+yy(n-2)+zz(2+2)<xx(1+1)+yy(n-1)+zz(1+2)+x(2+1)+y(n-2)+z(2+2) ①
整理得: x-y+z>xx-yy+zz; ②
也就是说在②的条件下,得到①中左式小于右式 使得这样排列总价值最小。