【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;
}
时间: 2024-10-12 21:38:25

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

hdu 4882 ZCC Loves Codefires(数学题+贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943

HDU-4882 ZCC Loves Codefires

http://acm.hdu.edu.cn/showproblem.php?pid=4882 ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 97    Accepted Submission(s): 55 Problem Description Though ZCC has many Fans,

hdu 4882 ZCC Loves Codefires(贪心)

# include<stdio.h> # include <algorithm> # include <string.h> using namespace std; struct node { int v; int t; }; struct node a[100010]; bool cmp(node a,node b) { return a.v *a.t+(a.v+b.v)*b.t<b.v*b.t+(a.v+b.v)*a.t; } int main() { int

hdu 4882 ZCC Loves Codefires(贪心)

题目链接:hdu 4882 ZCC Loves Codefires 题目大意:就是CF的比赛,根据时间的推迟会相应的扣掉题目的分数,问说最少扣几分. 解题思路:相邻交换法,判断两个题目之间的比率确定前后位置. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e5+5; typedef __int64 ll; struct st

hdu 4882 ZCC Loves Codefires (贪心 推导)

题目链接 做题的时候凑的规律,其实可以 用式子推一下的. 题意:n对数,每对数有e,k, 按照题目的要求(可以看下面的Hint就明白了)求最小的值. 分析:假设现在总的是sum, 有两个e1 k1 e2 k2 则先选e1 为 (sum+e1)*k1+(sum+e1+e2)*k2 先e2: (sum+e2)*k2 + (sum+e1+e2)*k1. 比较两个式子发现不同的部分分别是 e1*k2   e2*k1; 比较大小移向 e1/k1  e2/k2, 那个小,就选那个,能达到最小. 官方题解:

hdoj 4882 ZCC Loves Codefires 【贪心】

题目大意:求最少被扣除的时间 策略 如题: 对于两个邻近的题目i, j,对于他们对于在他们之前解决的题目的总时间的贡献t是不影响的,对于他们之后的总时间也不影响 这就推得对每一对相邻的他们对前后都是无影响的, 如果是交换的话原来是(t+e[i])*k[i] + (t+e[i]+e[j])*k[j], 就变成了(t+e[j])*k[j] + (t+e[i]+e[j])*k[i] 改变的就是 原来的 e[i]*k[j] 变成了 e[j]*k[i] 这两个式子之间满足 e[i]*k[j] < e[j]

HDU 4882 ZCC Loves Codefires(贪心水)

HDU 4882 ZCC Loves Codefires 题目链接 题意:给定一些任务,每个任务有e,k,e表示完成需要时间,k表示完成后消耗,为完成时间t * k,求一个顺序使得完成消耗最少 思路:贪心,知道k大的尽量早晚餐,t小的尽量早完成,所以t / k小的尽量早完成,排个序即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int

2014 (多校)1011 ZCC Loves Codefires

自从做了多校,整个人都不好了,老是被高中生就算了,题老是都不懂=-=原谅我是个菜鸟,原谅我智力不行.唯一的水题. Problem Description Though ZCC has many Fans, ZCC himself is a crazy Fan of a coder, called "Memset137". It was on Codefires(CF), an online competitive programming site, that ZCC knew Mems

JAVA hdu 4882 ZCC Loves Codefires

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4882 题解:参考题后Discuss javaherongwei 的讲解 考察序列中相邻的两题i, j(i在前).交换它们后,解出它们之前的题目所带来的时间对答案的贡献是不变的,它们对它们后面的题目的贡献也是不变的,其他题目之间对答案的贡献自然也是不变的.唯一的变化就是,原来的EiKj一项变成了EjKi一项.那么,为了使答案变优,需要满足的条件是EjKi≤EiKj.也即Ei/Ki≥Ej/Kj.那么,最