程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 杭電2525

杭電2525

編輯:C++入門知識

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;
}



 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved