Codeforces Round #764 (Div. 3) F. Interacdive Problem

 Problem - F - Codeforces

 交互题目
 题意的解释 :
样例给的输入不代表你程序的输入,没有参考意义。

 输入 n , 另一个输入是 tmp ;

 tmp 是 每次令 x + c 后 x + c / n 的结果 , 就是tmp ,他是程序的输入 ,因为打印了 +  c

 对应测试程序会输出一个值,那么他变成输入的tmp .

 对二分的理解
/*
*  1. 我们先假设 x = mid;

*  2. c的设置,c 取 (n - x) % n 让 (mid + c) / n 刚好 + 1 , 如果 x + c 也就是tmp 不等于 (mid + c) / n , 那么 x 是 < mid 的
*  否则 x 是 >= mid 那么就可以进行二分.

*  3. 上面只是考虑了第一步, mid 代表的是初始值, 

*  mid + c + all ; all 是前面一共加上的,此时 x = x + all;

*  将c 同理设置成 (mid + all) % n, 那么就是只有 >= mid 的数才会 (mid + all + c) / n > (mid + all) / n;
*/ 

#include<iostream>
using namespace std;
int ask(int c)
{   
	cout << "+" << " " << c << endl;
	int tmp;
	cin >> tmp;
	return tmp;
}
int main()
{
	int n;
	cin >> n;
	int l = 1, r = n - 1,add = 0;

	while (l < r)
	{
		int mid = l + r + 1 >> 1;
		int c = (n - (mid + add) % n); 
		int want = (mid + add + c) / n;
		add += c; // add 表示一共增加
		int real = ask(c);
		if (real == want)
		{
			l = mid;
		}
		else
		{
			r = mid - 1;
		}
	}

	cout << "!" << " " << l + add << endl;

 }

​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值