C语言顺序选择-Cutele and Chocolate

题目描述

UpMing喜欢奇数,所以在吃Chocolate的时候,他习惯一次只吃奇数个Chocolate;PushyTao喜欢偶数,所以在吃Chocolate的时候,他习惯一次只吃偶数个Chocolate(不包含0,否则他俩吃不到!)。这天Cutele买了n个Chocolate来到610,她知道了UpMing和PushyTao的习惯后,很是纳闷:why you so dog!但是Cutele聪明善良温柔大方,她想把Chocolate分给UpMing和PushyTao。

她想知道UpMing能否k次吃完这些Chocolate,PushyTao能否k次吃完这些Chocolate。

现在请聪明的你来帮Cutele解决这个问题吧!

 

输入描述

一行,输入两个正整数n,k,保证在int范围内。

 

输出描述

如果UpMing能k次吃完这些chocolate的话,请输出“UpMing yyds”;

如果PushyTao能k次吃完这些chocolate的话,请输出“PushyTao yyds”;

如果UpMing和PushyTao都能吃完这些chocolate的话,请输出“Cutele is so happy!”;

如果UpMing和PushyTao都不能吃完这些chocolate的话,请输出“Cutele is so sad.”;

(你只需输出引号内的内容,只需要输出一句话)

 

样例

输入 

4 2

输出 

Cutele is so happy! 

代码

#include<iostream>
using namespace std;

int main()
{
    int n,k;
    cin>>n>>k;

    int flag1=0,flag2=0;//做标记,flag1标记PushyTao能否成功,flag2标记UpMing能否成功

    int kk=n/2;
    int nn=n-k+1;

    if(n%2==0&&k<=kk)
		flag1=1;
    if(nn%2!=0&&nn>=0)
        flag2=1;
    if(flag1&&flag2)
        cout<<"Cutele is so happy!";
    else if(flag1)
        cout<<"PushyTao yyds";
    else if(flag2)
        cout<<"UpMing yyds";
    else
        cout<<"Cutele is so sad.";
    return 0;
}

 

核心思路

1)  对于PushyTao能否成功:

首先,要吃k次偶数个Chocolate使这些偶数的和等于n才可以。我们知道偶数+偶数+偶数+...+偶数=偶数,所以n必须是偶数才可以。然后我们想,除0之外最小的偶数就是2,那么我们可以求出n个Chocolate我们最多可以吃几次,即kk=n/2.

只要kk>=k,那么就一定可以成功。为什么呢?,因为如果k<kk,那我就可以让其中的一个2加上几个2,使之满足k次。比如说8个糖果,kk=8/2=4,如果k=3,

则可以是2+2+2*2;如果k=2,则可以是2+2*3。

因而只需判断n是偶数,并且kk>=k。

2)  对于UpMing能否成功:

同理,要吃k次奇数个Chocolate使这些奇数的和等于n才可以。那么我们可以这样想,以n=7,k=4为例,如果能成功,那么n=1+1+1+x,x必须是奇数才可以。即相当于前k-1次吃一个,那么剩下的第k次吃,第k次吃的必须是奇数,所以只需判断第k次是不是奇数。(至于为什么,因为奇数=奇数+偶数,如果这种情况满足了,你可以从nn中拿出偶数使前面的k-1个1成为其他的奇数)

即nn=n-(k-1)*1=n-k+1。判断kk是不是奇数即可,但注意nn要大于0。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值