首页 > 代码库 > 473. 核电站问题

473. 核电站问题

473. 核电站问题

★   输入文件:nucle.in   输出文件:nucle.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】

    一个核电站有 N 个放核物质的坑,坑排列在一条直线上。如果连续 M 个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。

任务:对于给定的 N 和 M ,求不发生爆炸的放置核物质的方案总数。

【输入格式】 
     输入文件(nucle.in)只一行,两个正整数 N , M( 1<N<50 , 2 ≤ M ≤ 5)

【输出格式】 
     输出文件 (nucle.out) 只有一个正整数 S ,表示方案总数。

【输入输出样例】
 
输入:

nucle.in

4 3

输出:

nucle.out

13

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 long long f[100];
 5 int main()
 6 {
 7     freopen("nucle.in","r",stdin); 
 8     freopen("nucle.out","w",stdout);
 9     int i,j,n,m;
10     cin>>n>>m;
11     f[0]=1;
12     for(i=1;i<=n;i++)
13     {
14         if(i<m)f[i]=2*f[i-1];   //当i<=m时,怎么放都不爆炸,所以求所有的方法(因为加一个坑时,只有两种方法,--放与不放,所以f[i]=2*f[i-1])
15         if(i==m)f[i]=2*f[i-1]-1;//当i==m时,用所有的方案减去所有坑都放的方案;
16         if(i>m)f[i]=2*f[i-1]-f[i-m-1];//用所有的方案减去会爆炸的方案
17 /*(i-m-1:因为f(i)为总方案数,又因为最后一个放,前面要有m-1个炸弹,才能引爆,所以m-1个的前面一个必须要不放;所以只有n-m-1的坑会变,求出此时的方案数 即f(i-m-1);)*/
18     }
19     cout<<f[n];
20     fclose(stdin);
21     fclose(stdout);
22     return 0;
23 }

 

473. 核电站问题