- 一个关于翻硬币的问题,
一摞硬币共 有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚…… 直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即 可。m为2时,翻3次即可;m为3时,翻9次即可;m为4时,翻11次即可;m为5时,翻24次即可;…;m为30时,翻899次即可;…
输 入:
仅有的一个数字是这摞硬币的枚数m,0<m<1000。
输 出:
为了使这摞硬币中的每一枚又都是正面朝上所必需翻的次数。
某单元格输入:
30 - /*
- * 翻硬币
- * tanliboy 23.Nov 2008
- */
- #include<iostream>
- #include<bitset>
- using namespace std;
- int n;
- bool* data;
- int partFlip()
- {
- bool term = false;
- int cnt = 0;
- for(int i=1;i<n;i++)
- {
- if(!term && data[i-1] != data[i])
- {
- continue;
- }else if(data[i] == false)
- {
- if(false == term)
- {
- term = true;
- cnt = i-1;
- }
- }else
- {
- return -1;
- }
- }
- if(false == term)
- {
- cnt = data[n-1] == false ? n-1 : n;
- }
- return cnt;
- }
- void flip()
- {
- bool* orig = new bool[n];
- for(int i = 0;i<n;i++)
- {
- orig[i] = data[i];
- }
- for(int i = 0;i<n;i++)
- {
- if(i%2 ==0)
- {
- data[i/2] = !orig[n-1-i];
- }else
- {
- data[n-1-i/2] = orig[n-1-i];
- }
- }
- delete[] orig;
- }
- int main()
- {
- cin>>n;
- data = new bool[n];
- for(int i = 0;i<n;i++)
- {
- data[i] = false;
- }
- int count = n;
- flip();
- do
- {
- int p = partFlip();
- if(p>=0)
- {
- count += p;
- break;
- }else
- {
- flip();
- count += n;
- }
- }while(true);
- cout<<count<<endl;
- delete[] data;
- return 0;
- }
Flip coins
最新推荐文章于 2018-08-31 23:44:13 发布