比赛 20110928 评测结果 AWWWWWWWWW
题目名称 垃圾陷阱 最终得分 10
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-09-28 21:46:28
显示代码纯文本
#include<iostream>
#include<stdio.h>//freopen
#include<string.h>//网上说加的!!
#include<cstdlib>//不知道是神马!
#include<stdlib.h>//快排必加!!
using namespace std;
int cmp(const void *a,const void *b);
int MAX=0;
bool q[210][5100];
int number,longth;//长度,个数
struct hehe
{
	int t,h,l;//时间,补得血,长度
}a[200];
void dp();//DP
int main()
{
	freopen ("well.in","r",stdin);
	freopen ("well.out","w",stdout);
	scanf("%d %d",&longth,&number);
	for (int i=0;i<number;i++)
	{
		scanf("%d %d %d\n",&a[i].t,&a[i].h,&a[i].l);
		MAX+=a[i].h;//求出最大可能的时间数,我感觉应该加10
	}
	MAX+=10;
	qsort(&a[1],number,sizeof(a[0]),cmp);//快排,看老师的,小不懂!
	dp();
}
int cmp(const void *a,const void *b)
{
	return ((hehe *)a)->t > ((hehe *)b)->t ? 1 : -1;//真不懂!
}
void dp()
{
	int answer=0;//有无结果的标志!
	q[0][10]=true;//因为开始有10小时的生命值,所以,在0位置,10生命值时为TRUE!!
	for (int i=0;i<number;i++)
	{
		if (answer)//不解释!
		{
			break;
		}
		for (int j=longth;j>=0;j--)
		{
			if (answer)//不解释!!
			{
				break;
			}
			for (int k=MAX;k>=0;k--)
			{
				if (answer)//不解释!!
				{
					break;
				}
				if (k-a[i].t>=0&&q[j][k])//如果能等到垃圾掉到地上,且这一点可以的话,就执行!
				{
					if (k+a[i].l>=longth)//应该先判断,我开始没先判断,吃亏呀,水呀,湿透了,哎呀,hot!!!
					{
						cout<<k;
						answer++;
					}
					q[j+a[i].l][k]=true;//如果这一点行的话,那么,下一块垃圾是让他吃,还是踩那?????吃还是踩这是个问题!!!!
					q[j][k+a[i].h]=true;//恩,不如都试试!呵呵呵呵呵呵呵!
					q[i][j]=false;//那么这一点就作废了!哎!
				}
			}
		}
	}
	if (!answer)//没找到答案的时候!
	{
		int ji=10;//开始有10的HP;
		for (int i=0;i<number;i++)
		{
			if (ji-a[i].l)//判断在垃圾掉下之前能活不!
			{
				ji=ji-a[i].l+a[i].h;
			}
		}
		cout<<ji;
	}
}
//PaulInsider(huenze)注释,编写,任何人转载请注意版权,呵呵呵呵!!
//胡恩泽(版权在手,天地任我游)!!
//我看行!!