poj3210

题意:很难理解,意思是,给出一些硬币,总数一定,要求对于任何一种情况(无论几个正面,几个反面)都恰好进行k次操作,不多不少,使得朝上的面统一。每次操作可以翻一枚硬币。输入硬币总数,求所有满足条件的k中最小的。无解输出no solution

分析:利用k的奇偶性。对于总数为偶数的情况。以六个为例,对于111111和111110,一个只能进行奇数次操作,另一个只能进行偶数次操作。k不可能既是奇数又是偶数,所以必定无解。 对于总数为奇数的情况。以五个为例,对于任意一种情况必定可以看成奇数个a面加上偶数个b面组成,由于11111必须要偶数次操作,所以所有情况都得偶数次操作,所以k为偶数,只能使所有的b面最终翻转为a面。所以对于最坏情况:10000的情况就只能进行4次操作,所以奇数k必定n-1。其实对于11111的情况k可以等于5,即所有1变为0,但是这种解已经大于刚才我们求出的n-1了,不是最优解,可以舍弃。

View Code
#include < cstdio >
#include
< iostream >
#include
< cstdlib >
#include
< cstring >
using namespace std;

int main()
{
// freopen("D:\\t.txt", "r", stdin);
int n;
while (scanf( " %d " , & n) != EOF && n != 0 )
{
if (n % 2 == 0 )
printf(
" No Solution!\n " );
else
printf(
" %d\n " , n - 1 );
}
return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值