当前位置:编程学习 > C/C++ >>

杭电2525

Clone Wars
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 244    Accepted Submission(s): 45

 

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

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

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

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

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

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


Input
第一行有一个整数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,结果可能会是个
很大的数哦。


Output
每个数据输出一行,表示截止当天现有的士兵已经给要塞造成的伤害。


Sample Input
1
1 4 2 2 4

Sample Output
25

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

 

#include<stdio.h>   
int D,A,K,X,N;  
__int64 sum(__int64 *a)  
{  
    int i;  
    __int64 sum=0;  
    for(i=1;i<=D;i++)//D天前所有士兵造成的伤害   
        sum+=a[i];  
    return sum;  
}  
void datatype_birth(__int64 *data,__int64 *people)  
{  
    int i;  
    for(i=K;i>0;i--)//每过一天,相当于把材料向后移了一天   
        data[i]=data[i-1];  
    for(data[0]=0,i=1;i<=A;i++)//材料的数量就是看这天有多少人   
        data[0]+=people[i];  
    people[0]=data[K];//第k天的的材料变成了士兵;   
}  
void datatype_death(__int64 *people)  
{  
    int i;  
    for(i=D+1;i>0;i--)//D天之后的士兵都死掉了   
        people[i]=people[i-1];  
}  
int main()  
{  
    int t;  
    int i;  
    __int64 people[105],data[105];//people指有多少人,data指材料;   
    __int64 attack;//造成的攻击伤害   
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d%d%d%d%d",&N,&D,&A,&K,&X);  
        memset(data,0,sizeof(data));  
        memset(people,0,sizeof(people));  
        people[1]=N;  
        for(attack=0,i=1;i<=X;i++)//求计算到X天的攻击总和   
        {  
            datatype_birth(data,people);  
            attack+=sum(people)*5;  
            datatype_death(people);  
        }  
        printf("%I64d\n",attack);  
    }  
    return 0;  
}  

#include<stdio.h>
int D,A,K,X,N;
__int64 sum(__int64 *a)
{
    int i;
    __int64 sum=0;
    for(i=1;i<=D;i++)//D天前所有士兵造成的伤害
        sum+=a[i];
    return sum;
}
void datatype_birth(__int64 *data,__int64 *people)
{
    int i;
    for(i=K;i>0;i--)//每过一天,相当于把材料向后移了一天
        data[i]=data[i-1];
    for(data[0]=0,i=1;i<=A;i++)//材料的数量就是看这天有多少人
        data[0]+=people[i];
    people[0]=data[K];//第k天的的材料变成了士兵;
}
void datatype_death(__int64 *people)
{
    int i;
    for(i=D+1;i>0;i--)//D天之后的士兵都死掉了
        people[i]=people[i-1];
}
int main()
{
    int t;
    int i;
    __int64 people[105],data[105];//people指有多少人,data指材料;
    __int64 attack;//造成的攻击伤害
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d%d",&N,&D,&A,&K,&X);
        memset(data,0,sizeof(data));
        memset(people,0,sizeof(people));
        people[1]=N;
        for(attack=0,i=1;i<=X;i++)//求计算到X天的攻击总和
        {
            datatype_birth(data,people);
            attack+=sum(people)*5;
            datatype_death(people);
        }
        printf("%I64d\n",attack);
    }
    return 0;
}



 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,