首页 > 试题广场 > 猜数
[编程题]猜数
  • 热度指数:932 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛牛和妞妞正在玩一个猜数游戏,妞妞心里想两个不相等的正数,把这两个正数的和y告诉牛牛。
妞妞声称这两个数都不超过x,让牛牛猜这两个数是多少。
牛牛每猜一次,妞妞会告诉他猜对了还是猜错了,猜对了就停止游戏,猜错了就直到牛牛猜对为止。
妞妞为了加大难度,有时会误报x的大小,如果牛牛可以判断出了这个x是错误的,就会直接询问妞妞答案。
牛牛最坏情况下要猜多少次才能猜到妞妞想的数呢?

输入描述:
两个整数x,y。1<=x,y<=1014


输出描述:
一个数n,表示牛牛在最坏情况下猜测的次数。
示例1

输入

7 10

输出

2
示例2

输入

4 10

输出

0
#include <bits/stdc++.h>
using namespace std;

int main(){
    long x,y;
    cin>>x>>y;
    if(x>=y)
        cout<<((y-1)>>1)<<endl;
    else{
        if((x<<1)<y)
            cout<<0<<endl;
        else
            cout<<x-(y>>1)<<endl;
    }
    return 0;
}

发表于 2019-08-19 23:04:22 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    long x,y;
    cin>>x>>y;
    if((x<<1)<=y)
        cout<<0;
    else {
        long t = x>=y ? 1:y-x;
        cout<<((y+1)>>1)-t;
    }
    return 0;
}

发表于 2019-11-15 17:14:53 回复(0)
var arr = readline().split(' ');
var x = parseInt(arr[0]);
var y = parseInt(arr[1]);
var i = 0;
if(x >= y/2){
    if(x >= y){
        x = y - 1;
    }
     i = x - Math.floor(y/2);
}
print(i);
发表于 2019-09-03 19:16:36 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long x,y;
    cin>>x>>y;
    if(x*2<y)
    {
        cout<<0<<endl;
        return 0;
    }
    long long high, middle, num = 0;
    if(x>=y)
    {
        high = y - 1;
        middle = y/2;
        num = high - middle;
        if(y%2==0)
            num = num + 1;
    }
    else
    {
        high = x;
        middle = y/2;
        num = high - middle;
        if(y%2==0)
            num = num + 1;
    }
    cout<<num<<endl;
    return 0;
}

发表于 2019-07-17 18:44:14 回复(0)
想了半天没明白为啥 7 10 答案是2 而不是5。
最后终于看见了题干要求不相等的两个正数。。。
算一下上下边界就行了。
可能性就是
1 9
2 8
3 7 
4 6
5 5
……
可行域范围满足a,b<=7。直接数a,从1数到x。
那就是左边的数字a从1数但要满足b = y-a<=x.
则a的下界为max(1,y-x)。
最多数到x,此时得到上界,为x,但不能超过y,因此是min(x,y)
还要把存在相等情况去了,比如a=b的情况。
去完后还要除以2,我佛了。因为这里不要求顺序,1 9和9 1是一种情况,搞笑。
x,y = [int(x) for x in input().split()]
left = max(1,y-x)
right = min(x,y)
times = right - left + 1
if y%2==0:
    times-=1
times = (times)//2
if times<0:
    times = 0
print(times)


发表于 2019-11-30 21:20:27 回复(0)
#include <stdio.h>
int main() { 
  long long x, y;
  scanf("%ld %ld", &x, &y);

  long long n = y / 2 + 1;
  x = x > y - 1 ? y - 1 : x;
  long long ret = x - n;
  printf("%ld\n", ret < 0 ? 0 : ret + 1);

  return 0;  } 

编辑于 2019-08-01 21:52:30 回复(0)
while(line=readline()){
  line=line.split(" ")
  let x=parseInt(line[0]);
  let y=parseInt(line[1]);
  
  if(x>=y){
    print(Math.floor((y-1)/2));
  }
  
  else{
    if(y>2*x){
    print(0)
  }
    else{
      let max=Math.max(x,(y-x));
  let min=y-max
  print(Math.floor((max-min)/2)+1);
    }
    
  }
  
}
感觉在写高中数学。。。

以a b为坐标轴建立坐标系  直线a+b=y 和 a=x b=x 交于 i j 两点 (i<j)
即f(a)=-a+y 在[i,j]上的取值组合为答案的可行解。
分情况讨论:
1. 当x>=y 的时候
因为x>=y 所以x没什么卵用 一定可以推出正确答案
i 和 j为a+b=y 与坐标轴的交点 此时只需要剔除 可行解中a=0 b=0(a b为正数) 和a=b的时候的组合 然后除以2(部分可行解对称)的情况便可。

2.当y>2x 的时候 
明显x是错的 输出0

3.当想x<y<2x的时候
剔除 可行解中a=0 b=0(a b为正数) 和a=b的时候的组合 然后除以2(部分可行解对称)的情况便可。
发表于 2019-08-01 18:01:37 回复(0)