某wzms改自高联的组合题

原题:小明把m枚硬币放在一个n个端点的线段上.定义一次“操作”:从一个至少有2枚硬币的点取走2枚硬币,分别在每个相邻的点上放1枚(若只有一个相邻点就只在一个相邻点上放1枚).对小明的每种摆法,第n个点An无硬币,则总数经过若干次“操作”,使点An处有硬币,求n的最小值。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int inline gin(){
 5     char c=getchar();
 6     int s=0;
 7     while(c<'0'||c>'9'){
 8         c=getchar();
 9     }
10     while(c>='0'&&c<='9'){
11         s=(s<<3)+(s<<1)+(c^48);
12         c=getchar();
13     }
14     return s;
15 }
16 
17 int n,a[10001],k=0;
18 
19 int tf(int s){
20     memset(a,0,sizeof(a));
21     a[1]=s;
22     for(int i=1;i<n;i++){
23         while(a[i]>=2){
24             a[i+1]+=a[i]/2;
25             a[i]=a[i]%2+(a[i]/2)/2;
26         }
27     }
28     if(a[n])return 1;
29     return 0;
30 }
31 
32 int main(){
33     for(n=1;n<=20;n++){
34         for(int i=pow(2,n-1)-1;;i--){
35             if(!tf(i)){
36                 k=i+1;
37                 break;
38             }
39         }
40         cout<<n<<" "<<k<<endl;        
41     }
42     return 0;
43 }n m
1 1
2 2
3 4
4 7
5 12
6 19
7 29
8 45
9 68
10 104
11 157
12 237
13 357
14 537
15 808
16 1213
17 1821
18 2735
19 4104
20 6157
21 9237
22 13858
23 20788
24 31184

  输出结果

猜你喜欢

转载自www.cnblogs.com/wzsyyh/p/12147310.html
今日推荐