1.耍杂技的牛
https://www.acwing.com/problem/content/description/127/
风险系数 交换前 交换后
第i头牛 W[1]+W[2]+...+W[i-1]-S[i] W[1]+W[2]+...W[i-1]+W[i+1]-S[i]
第i+1头牛 W[1]+W[2]+...+W[i-1]+W[i]-S[i+1] W[1]+W[2]+...W[i-1]-S[i+1]
风险系数(减去公共项) 交换前 交换后
第i头牛 -S[i] W[i+1]-S[i]
第i+1头牛 W[i]-S[i+1] -S[i+1]
if W[i]-S[i+1] > W[i+1]-S[i]
then W[i]+S[i] > S[i+1]+W[i+1]
//按照w+s排序
int cmp(Node x,Node y)
{
return x.w+x.s < y.w+y.s ? 1:0;
}
//计算sum的最大值
sum[i]=W[1]+W[2]+...W[i-1]-S[i]
//未优化
int res=INT_MIN;
for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=1;j<=i-1;j++)
sum+=a[j].w;
sum-=a[i].s;
res=max(res,sum);
}
2.国王游戏
https://www.acwing.com/problem/content/description/116/
//未高精度
int res=INT_MIN;
for(int i=1;i<=n;i++)
{
int sum=1;
for(int j=1;j<=i-1;j++)
sum=sum * p[j].a;
sum=double(sum) / double(p[i].b);
res=max(res,sum);
}
//前缀和
for(int i=1;i<=n;i++)
s[i]=s[i-1]*p[i].a;
int res=INT_MIN;
for(int i=1;i<=n;i++)
{
int sum=s[i-1];
sum=double(sum)/double(p[i].b);
res=max(res,sum);
}