首页 > ACM题库 > HDU-杭电 > hdu 2525 Clone Wars-模拟-[解题报告]C++
2014
02-09

hdu 2525 Clone Wars-模拟-[解题报告]C++

Clone Wars

问题描述 :

逐青曾经很喜欢玩战略游戏,有一段时间他一直泡在自己发现的一个游戏《克隆人大战》里。有一次逐青碰上这样的局面:
他的建筑也全部被摧毁,只留下几个克隆人士兵和一个生化学家,不过敌人的有生力量也已经全部被剿灭,
头疼的是敌人留下了一个艰固的要塞,要塞的血多得无法估计。

更糟的是逐青无法占领它,不知道到底需要多久,逐青才能用剩下的兵力摧毁要塞,赢得游戏。
不过希望还是有的,敌人要塞只守不攻,更好的是生化学家可以
用仅存的仪器克隆现有的士兵来增加士兵的数量,不过也有一定的限制:

一、克隆人是有先天缺陷的,因此他们只能存在D天(游戏中的时间);

二、生化学家从一个士兵身上取得的克隆材料,培育到第K天后成长为士兵
(克隆成功),第K+1天开始执行任务;

三、每个士兵自成功克隆后,只有前A天取得的材料才能作为有效的克隆材料。

每个士兵每天只能对要塞造成5点的伤害,虽然数量越来越多,但攻破之日
还是遥遥无期啊。逐青给他的士兵们分配好任务后,就干自己的事情了,
只是在第X天回来看看现有的兵已经给要塞造成了多少伤害(包括当天的伤害)。
以逐青的心算能力,X一大他的脑子就一团浆糊了,不过他知道对于acmers来说,
这只是个超级简单的问题。^_^

输入:

第一行有一个整数t,代表有t组数据。接下来t行,每行有一组数据,
有N,D,A,K,X五个正整数,N是逐青刚开始拥有的士兵数量(不包括生化学家,
为简化问题,最初的N个兵视为刚培育成功),D,A,K,X见题目表述。数据范围
分别为 0<N<=100,0<D<=100,0<K+A<=D,0<X<=50,结果可能会是个
很大的数哦。

输出:

第一行有一个整数t,代表有t组数据。接下来t行,每行有一组数据,
有N,D,A,K,X五个正整数,N是逐青刚开始拥有的士兵数量(不包括生化学家,
为简化问题,最初的N个兵视为刚培育成功),D,A,K,X见题目表述。数据范围
分别为 0<N<=100,0<D<=100,0<K+A<=D,0<X<=50,结果可能会是个
很大的数哦。

样例输入:

1
1 4 2 2 4

样例输出:

25

Hint
case 1:刚开始有1个士兵(视为第0天培育成功),那么士兵从第1天到第2天都能 取得有效的克隆材料,并在第3天和第4天分别培育出一个克隆人士兵, 该士兵在第5天死亡(当天不输出伤害),所以第四天一共有两个士兵存在, 当天输出了10点伤害。

点击打开链接

只需要记录每天的人数,以及收集的种子数

#include"stdio.h"
#include"string.h"
__int64 p[105],w[105];
int main()
{
	int T;
	int i,j;
	int n,d,a,k,x;
	__int64 sum;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d%d%d",&n,&d,&a,&k,&x);
		//p[i]表示活i天的人数
		//w[i]表示第i天的种子数
		memset(p,0,sizeof(p));
		memset(w,0,sizeof(w));
		p[0]=n;
		sum=0;
		for(i=1;i<=x;i++)
		{
			for(j=d;j>=0;j--)
				p[j+1]=p[j];
			for(j=k;j>=0;j--)
				w[j+1]=w[j];
			p[0]=w[k];

			w[0]=0;
			for(j=1;j<=a;j++)
				w[0]+=p[j];

			for(j=1;j<=d;j++)
				sum+=p[j];
		}
		printf("%I64d\n",sum*5);
	}
	return 0;
}

解题转自:http://blog.csdn.net/yangyafeiac/article/details/8886802


  1. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。

  2. #include <stdio.h>
    int main(void)
    {
    int arr[] = {10,20,30,40,50,60};
    int *p=arr;
    printf("%d,%d,",*p++,*++p);
    printf("%d,%d,%d",*p,*p++,*++p);
    return 0;
    }

    为什么是 20,20,50,40,50. 我觉得的应该是 20,20,40,40,50 . 谁能解释下?

  3. 约瑟夫也用说这么长……很成熟的一个问题了,分治的方法解起来o(n)就可以了,有兴趣可以看看具体数学的第一章,关于约瑟夫问题推导出了一系列的结论,很漂亮