【BZOJ3850】【HDU4882】ZCC Loves Codefires 数论,叉积,贪心 “再不刷它就土了”系列

转载请注明出处http://blog.csdn.net/vmurder/article/details/42848881

这样如果转载瞎了读者还能看到干净的原文~~


毕竟是HDU收录的题,,我怀疑它要变土。。


题意:

有n个项目,然后第一行输入损失度,第二行输入耗时

然后安排一下顺序,

每一项的消耗为当前已经做了的(包括此项)总时间*损失度。

求最小总消耗。


首先这道题是贪心,我们可以贪心排序项目。

策略:

	bool operator < (const YYC &a)const
	{return x*a.y<y*a.x;}

证明:

首先我们考虑将项目随意排序!

然后(思想上)得到ans_now,这个时候我们可以交换相邻两项,使得结果更优当且仅当满足上述策略。

而我们的这次交换[对于全局是没有影响的]!

这里再对于上一句的[]再证明一下:{

首先影响分两个方面,

①:其它项目时刻的损失:因为对于其它的相对顺序没有改变,所以没有影响

②:对于其它"交换"的影响:

我们发现这个策略可以交换一下项,使得每一边都是一种项目的变量——x/y<a.x/a.y

或者直接发现:这不是叉积么?这样就满足了单调性,使得交换成立,不影响其它次的交换。

}

而显然这样的交换是可以最终满足两两相邻之间的优劣性顺序,同时在上两行的证明中有说“单调性”

这样就满足了全局最优。


可能说得有点扯淡,但是思路上应该差不多。

姑且这样吧。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101000
using namespace std;
struct YYC
{
	int x,y;
	bool operator < (const YYC &a)const
	{return x*a.y<y*a.x;}
}fev[N];
int n;
long long ans,sum;
int main()
{
	int i;scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&fev[i].x);
	for(i=1;i<=n;i++)scanf("%d",&fev[i].y);
	sort(fev+1,fev+n+1);
	for(i=1;i<=n;i++)sum+=fev[i].x,ans+=sum*fev[i].y;
	cout<<ans<<endl;
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值