您的位置:首页 > 其它

POJ-3210-Coins-解题报告

2011-01-26 10:54 239 查看
题意:

给定n个硬币,进行x次翻转,每次只能翻转一个硬币,且每个硬币可被翻转多次。

问:对于所有初始情况下的硬币(即正反面的硬币数不一样),直少需要翻转几次才能达到所有硬币均处于同一面的状态。

分析:

1. n为偶数。

1)若所有硬币均处于同一面,最小翻转次数x一定是偶数。

2)若不是所有硬币均处于同一面,则一定是以下两种情况:

i. 正面数为奇,反面数也为奇。最小翻转次数一定为奇。

ii.正面数为偶,反面数也为偶;最小翻转次数一定为偶。

由以上分析,知不存在最小翻转次数x,使得经过x次翻转后,所有硬币均处于同一面。

2. n为奇数。

1)若所有硬币均处于同一面,最小翻转次数x一定是偶数。

2)若不是所有硬币均处于同一面,则一定是以下两种情况:

i. 正面数为奇,反面数为偶。最小翻转“偶”次数可以这样达到:

先翻转所有的反面硬币(偶),接着便是翻转所有处于同一面的硬币(偶),可以达到偶次翻转。

ii.正面数为偶,反面数为奇。最小翻转“偶”次数可以这样达到:

先翻转所有的正面硬币(偶),接着便是翻转所有处于同一面的硬币(偶),可以达到偶次翻转。

对于i,ii这两种的所有情况,都是先翻转具有同一***有偶数个的硬币。这样求出最小的x为:

x = n - 1

简单说下上式为何成立。至少n-1次翻转对应的是1个硬币与n-1个硬币不同面的情况,翻转这n-1个硬币便可达到目标;对于其他有2,3,4……,n-1个硬币跟余下硬币不同面的情况,均可进行n-1次翻转后达到目标。如有2个硬币与余下的n-2个硬币一同面,则先翻转该2个硬币,接着所有硬币便处于同一面,翻转n-1-2便也达到目标。

代码:

#include <iostream>

using namespace std;

int main()
{
    int n;
    while(cin >> n , n != 0) {
        if(n % 2 == 0)
            cout << "No Solution!" << endl;
        else
            cout << n - 1 << endl;
    }

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: