【HDU5188 BestCoder Round 33C】【贪心排序+DP】zhx and contest 考试不被怀疑作弊条件下达到至少m分的最少时间

原创 2015年11月19日 20:52:15
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=3e6+10,M=0,Z=1e9+7,ms63=1061109567;
int casenum,casei;
int n,m;
struct A
{
	int t,v,l,st;
	bool operator < (const A& b)const {return l-t<b.l-b.t;}//按照耽误时间从小到大排序
}a[32];
int f[N];
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		LL sumv=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d%d",&a[i].t,&a[i].v,&a[i].l);
			a[i].st=max(a[i].l,a[i].t);//st表示最早结束时间
			sumv+=a[i].v;
		}
		if(sumv<m)
		{
			puts("zhx is naive!");
			continue;
		}
		sort(a+1,a+n+1);
		int sumt=0;
		int tmpv=0;
		for(int i=1;i<=n;i++)
		{
			sumt=max(sumt+a[i].t,a[i].l);
			tmpv+=a[i].v;
			if(tmpv>=m)break;
		}
		if(sumt>1e3)while(1);
		memset(f,0,(sumt+2)*4);
		for(int i=1;i<=n;i++)
		{
			for(int j=sumt;j>=a[i].st;j--)if(f[j]<m)//减少不必要的运算,同时防止爆int
			{
				gmax(f[j],f[j-a[i].t]+a[i].v);
			}
		}
		for(int i=0;i<=sumt;i++)if(f[i]>=m)
		{
			printf("%d\n",i);
			break;
		}
	}
	return 0;
}
/*
【trick&&吐槽】
小心a[i].v累加起来爆int哦

【题意】
T(50)组数据,
对于每组数据,有n(1<=n<=30)个问题,
对于第i个问题,如果我们决定去做,那么会花费ti分钟,然后会获得vi的分数。
然而,对于第i道题而言,其解决时间不能早于li(可以等于),否则会被认定为作弊。
1<=ti,li<=1e5;1<=vi<=1e9.
现在我们问你,他至少在场上待多久才可以在不认定为作弊的条件下得到至少m(0<=m<=1e9)分。
如果无法达成,则输出"zhx is naive!"

【类型】
贪心 DP

【分析】
首先,无法达成的条件是当前分数之和<m,这个特判一下,看看要不要输出"zhx is naive!"
否则,肯定至少有一种方法能够达成目标。

我们发现,这题既要决策做哪些题,又要决策做题顺序。
于是,不如我们先假定要做的题已经确定了,现在只是要考虑做题顺序。
这样就会发现,肯定是按照耽误时间从小到大来安排做题顺序。
于是,现在考虑到题的选择,我们先按照耽误时间从小到大来对所有题目做排序。

我们用f[j]表示在当前距离比赛开始过去了j个时间单位条件下能够获得的最大分数。
那么初始化f[]=0,并且有状态转移方程——
for(int i=1;i<=n;i++)
{
	for(int j=sumt;j>=max(a[i].l,a[i].t);j--)gmax(f[j],f[j-a[i].t]+a[i].v);
}

然后枚举一道题做或不做。并且积累在当前时间为j下的分数,记做f[i]。
那么我们就有了状态转移方程gmax(f[i],f[j]+最早从j+1时刻做这道题的最早完成时间)

【时间复杂度&&优化】
O(T*n*sumt),最坏是50*30*30*1e5=45e8的时间复杂度
然而大概是数据太水了,竟然这个复杂度也是可以0msAC的>_<。

*/

版权声明:题解中哪里写错请一定要指出来QwQ 转载还请注明下出处哦,谢谢^_^ 举报

相关文章推荐

【HDU5188 BestCoder Round 33C】【贪心排序+DP】zhx and contest 考试不被怀疑作弊条件下达到至少m分的最少时间

#include #include #include #include #include #include #include #include #include #include #include #...

POJ 1328 Radar Installation 贪心最少区间问题

这算是一道贪心的题目把,但是在自己做的时候,并没有想到比较好的贪心策略。 贪心策略: 对每一个雷达,求出它辐射的X坐标的范围,标记成一个区间。 如此,这个题目就变成了求最少区间问题传送门:POJ...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

一生一世

遇见你,是我今生最美的缘。爱情是一种宿命,今生来到这个世界,只为在老去的渡口,等某个归人,看日落烟霞。——题记     【一】爱你,就是真理     这世界没有什么真理,我想唯一的...

喜欢你

有多少人、多少份感情,并不是败给了距离,也不是输给了时间,只是缺乏了一份勇敢面对的勇气,错失了最佳的时机。感情与生活不同,在感情的世界里,我们可以拘谨,但不能太拘束,很多时候都需要你理直气壮地说出来,...

我在海上飘

多少次回眸,看到的只是寂寞的影子,记忆里的曾经,在不觉中模糊了流年。沉默的海上,忧郁的蓝,却始终没能再次邂逅那一场美丽,留下我,孤独的不知该飘往何处?     ——题记     不...

贪心算法-求区间至少连续k的最大和

题意:对于一个整数n,表示该区间整数的个数,求至少有k个连续的数是该区间中一段的最大和。 n的范围在1~10^6。k(-1000~1000); 分析:这道题看似有点像树状数组,但要想求出区间至少有...

漫步空间

我喜欢漫步在空间里,穿梭在网友和自己的空间里,带着欣赏的喜悦,带着真挚的友谊,带着真诚的祝福,聆听空间里那一首首悠扬的音乐,欣赏那一幅幅美丽的画卷。空间是交流的地方,是一个心灵的园地,要我们共同耕耘。...

相遇

我与你相遇,在最美的诗词歌赋里。     你如水中月,空垂倒落人间氤氲,飘飘袅袅,你如镜中花,永世不朽笑靥繁花,清清寡寡。你珠眉秀黛,珠唇半微,品味人间千百味,你时而在水之湄,溯游难追,时而...

思念,

早春的夜,冷雨敲窗,打开了取暖器,让寒凉的心顿时有了温热,这温热瞬间漫过了指尖,直达心脏。回想起那些生命中相伴走过的美好时光,如寒风中的烟火,暖暖的带着一丝柔软,让人妥贴舒适地想靠近,此刻的心填满了绵...

过去

妈妈说:“那些岁月……”     我在没心没肺的看着渐渐远去的落日,从不知道悲伤是那种滋味。     或许,年龄的脚步没有踏过岁月的伤痕,渐渐地,妈妈老了,而我,也在慢慢地走过年华...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)