【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 转载还请注明下出处哦,谢谢^_^

上机考试作弊程序

原文地址:上机考试作弊程序作者:neolone  做这个程序是因为我实在来不及背马克思的题库了,60页+的题库我是看不完了,所以心生歹念想到了类似有道词典的划词查找功能,当然像有道词典那样鼠标放上去就...
  • trtos
  • trtos
  • 2014年08月01日 15:08
  • 1317

hdoj5187zhx's contest【快速幂+快速乘法】

zhx's contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To...
  • R1986799047
  • R1986799047
  • 2016年03月13日 16:47
  • 492

—【贪心算法】多机调度问题

0026算法笔记——【贪心算法】多机调度问题 分类: 算法2013-03-30 17:51 382人阅读 评论(0) 收藏 举报 多机调度问题算法笔记贪心算法最小堆     ...
  • pi9nc
  • pi9nc
  • 2013年08月04日 21:16
  • 2166

DP与贪心算法的一点浅见

DP:考虑且仅仅考虑由前一阶段状态转移到当前状态后,递推并选取出当前状态的最优解,具有无后效性和最优子结构的基本特征,其中所谓的无后效性是指:“下一时刻的状态只与当前状态有关,而和当前状态之前的状态无...
  • zhang360896270
  • zhang360896270
  • 2013年04月26日 12:14
  • 5528

POJ1328 -- 贪心算法和快速排序

一 。贪心策略:将雷达放置在合适的地方,使得包含的岛屿数量最多。 二。具体分析 我们采用从左到右放置雷达。假设左边第一个岛屿是A(Xa,Ya),从左到右的岛屿依次是A B C .... 我们可以计算出...
  • Genius9_9
  • Genius9_9
  • 2015年06月02日 15:31
  • 686

「LibreOJ β Round #2」贪心只能过样例 [bitset]【STL】

题目链接:https://loj.ac/problem/515 ——————————————————————————————————515. 「LibreOJ β Round #2」贪心只能过样例内...
  • qq_33184171
  • qq_33184171
  • 2017年07月03日 14:51
  • 386

树的最小顶点覆盖

最小顶点覆盖问题是算法设计中一个非常著名的NP完全问题,下面给出顶点覆盖问题的描述:   给定一个无向图:G=(V, E)和一个正整数k,判定是否存在一个顶点子集,其中=k,使得对于任意有u∈V'...
  • XuanZuoNuo
  • XuanZuoNuo
  • 2013年08月26日 12:58
  • 1406

【HDU5747 BestCoder Round 84A】【贪心 细节】Aaronson m范围最少数量2的幂凑成n

Aaronson Accepts: 607 Submissions: 1869 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 1310...
  • snowy_smile
  • snowy_smile
  • 2016年07月25日 09:30
  • 419

【贪心】【JSOI2010】缓存交换

缓存交换 【问题描述 】 在计算机中,CPU只能和高速缓存Cache直接交换数据。当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache。此时,如果Cache容量已满,则必须先从中...
  • u013233739
  • u013233739
  • 2014年03月22日 17:48
  • 745

BestCoder Round #85 抽屉原理/贪心/质因数

hdu 5776 sum题意: 给一个n个数的数列,求是否存在一个连续和是m的倍数,存在输出YES。 分析: 预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍...
  • hjt_fathomless
  • hjt_fathomless
  • 2016年07月31日 11:22
  • 162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【HDU5188 BestCoder Round 33C】【贪心排序+DP】zhx and contest 考试不被怀疑作弊条件下达到至少m分的最少时间
举报原因:
原因补充:

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