[补题]G2. Ruler (hard version)

G2. Ruler (hard version)

在这里插入图片描述

思路:
hard和easy版的区别就是从10次查询变成7次。如果是10次,那么可以每次查询一个正方形用二分的方法容易的做出来。 如果是7次,可以用类似于三分的方法,查询 l × r l\times r l×r的矩形的结果q:
q = l m ∗ r q= lm*r q=lmr x > r m x>rm x>rm
q = l m ∗ ( r m + 1 ) q=lm*(rm+1) q=lm(rm+1) l m < x < = r m lm<x<=rm lm<x<=rm
q = ( l m + 1 ) ∗ ( r m + 1 ) q=(lm+1)*(rm+1) q=(lm+1)(rm+1) x > = l m x>=lm x>=lm

log ⁡ 2 1000 ≈ 9.966 , log ⁡ 3 1000 ≈ 6.288 \log_2 1000 \approx 9.966,\log_3 1000 \approx 6.288 log210009.966log310006.288 次数满足题目要求。

代码:

//三分(hard version)
#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;

void solve();

signed main() {
	cin.tie(0)->ios::sync_with_stdio(0);
	
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	
	return 0;
}
int query(int a, int b) {
	printf("? %d %d\n", a, b);
	fflush(stdout);
	int response;
	cin >> response;
	return response;
}

//bool check(int mid) {
//	if (query(mid, mid) != mid * mid) {
//		return true;
//	}
//	return false;
//}

void solve() {
	int l = 2, r = 999;
	while (l < r) {
		int lm = l+(r-l) / 3 ,rm = l+(r-l)*2/3;
		int q =query(lm,rm);
		if (q==lm*rm) {
		l = rm + 1;
		} else if(q==(lm+1)*(rm+1)){
			r = lm;
		} else{
			l=lm+1;
			r=rm;
		}
	}
	printf("! %d\n", l);
	fflush(stdout);
}
  • 44
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值