题目描述
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。