首页 > 试题广场 > 猜数
[编程题]猜数
牛牛和妞妞正在玩一个猜数游戏,妞妞心里想两个不相等的正数,把这两个正数的和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 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)
#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)