P1146 硬币翻转
Posted kyriech-francis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1146 硬币翻转相关的知识,希望对你有一定的参考价值。
P1146 硬币翻转(超链接)
我终于写这个题了,我太难了!
在做这道题的时候,我竟然在相关讨论里找到了这个?!
刚刚开始的我是这么想的(我不会,管理员不会,所以我=管理员)
规律如下:
n表示有几个硬币(偶数)。正面为0,反面为1.m表示次数 假设n=6, 初始为正面
000000
将第2个至第6个翻转
011111 m=1
定义变量k,表示不进行翻转的硬币。 此时k=2(加粗)
011111
将除k以外的硬币翻转
110000 m=2
k+1
110000
将除k以外的硬币翻转
000111 m=3
k+1
000111
(继续)……
111100 m=4
111100
000001 m=5
直到k=n
000001
最后,将第1个至第5个翻转
111111
共6次
可得出,当k从2变到n时需要n-1次 加上第1次,得出共需要n次
当n=8
初始:0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 m=1
0 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 m=2
1 1 0 0 0 0 0 0
0 0 0 1 1 1 1 1 m=3
0 0 0 1 1 1 1 1
1 1 1 1 0 0 0 0 m=4
1 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1 m=5
0 0 0 0 0 1 1 1
1 1 1 1 1 1 0 0 m=6
1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 1 m=7
0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 m=8
当n=10.12.14……亦是如此。
这个题就实现了,回头一看,并不难。
代码实现如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int main() 5 { 6 int n,a[200],i,j; 7 cin>>n; 8 for(i=1;i<=n;i++) 9 a[i]=0; 10 cout<<n<<endl; 11 cout<<"0"; 12 for(i=2;i<=n;i++) 13 { 14 a[i]=1; 15 cout<<a[i]; 16 } 17 cout<<endl; 18 int k; 19 for(k=2;k<=n-1;k++) 20 { 21 for(j=1;j<=k-1;j++) 22 { 23 if(a[j]==0) 24 a[j]=1; 25 else 26 a[j]=0; 27 } 28 for(j=k+1;j<=n;j++) 29 { 30 if(a[j]==0) 31 a[j]=1; 32 else 33 a[j]=0; 34 } 35 for(j=1;j<=n;j++) 36 cout<<a[j]; 37 cout<<endl; 38 } 39 for(i=1;i<=n;i++) 40 cout<<"1"; 41 cout<<endl; 42 return 0; 43 }
不要抄袭,看看就好,希望给你提供思路。
以上是关于P1146 硬币翻转的主要内容,如果未能解决你的问题,请参考以下文章