POJ-3210-Coins-解题报告

题意:
给定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; }

你可能感兴趣的:(POJ-3210-Coins-解题报告)