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 } 

 

不要抄袭,看看就好,希望给你提供思路。

 

posted @ 2020-02-10 07:49  柠月与梦  阅读(368)  评论(0编辑  收藏  举报