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 硬币翻转的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1146 硬币翻转

带有多个打印问题的硬币翻转程序

洛谷——P2708 硬币翻转

硬币翻转指令

如何模拟有偏硬币的翻转?

位操作:更难翻转硬币