百度历届笔试题(1)

题目描述

牛牛和妞妞正在玩一个猜数游戏,妞妞心里想两个不相等的正数,把这两个正数的和y告诉牛牛。

妞妞声称这两个数都不超过x,让牛牛猜这两个数是多少。

牛牛每猜一次,妞妞会告诉他猜对了还是猜错了,猜对了就停止游戏,猜错了就直到牛牛猜对为止。
妞妞为了加大难度,有时会误报x的大小,如果牛牛可以判断出了这个x是错误的,就会直接询问妞妞答案。
牛牛最坏情况下要猜多少次才能猜到妞妞想的数呢?

输入描述:

两个整数x,y。1<=x,y<=1014。

输出描述:

一个数n,表示牛牛在最坏情况下猜测的次数。

示例1

输入

7 10

输出

2

示例2

输入

4 10

输出

0

思路:我们考虑分情况讨论:

首先剔除掉特殊情况:2*x>y,此时我们能够直接判断出妞妞给出的是错误的x,因为若两个数都小于等于x,则两数之和此时不可能为y!

若x>=y,此时我们知道两个数中最大的数为y,另一个数为0,因此最坏的猜测次数是(y-1)/2【除以2是因为比如说两个数是2和3,则a=2,b=3与a=3,b=2是等价的】

若x<y,此时其中一个数的最大值为x,另一个数为y-x,因此最坏情况下的猜测次数是{x-(y-x)}/2=x-y/2

#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long
ll x,y;
int main(void){
    scanf("%lld%lld",&x,&y);
    if(x*2<=y)
        printf("0\n");
    else{
        if(x>=y)
            printf("%lld\n",(y-1)/2);
        else
            printf("%lld\n",x-y/2);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值