专栏文章
题解:P12822 [NERC 2021] Interactive Treasure Hunt
P12822题解参与者 10已保存评论 10
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @minn1mrh
- 此快照首次捕获于
- 2025/12/02 05:05 3 个月前
- 此快照最后确认于
- 2025/12/02 05:05 3 个月前
upd:
[2025/10/28 17:06] 发现了代码中的错误,糖丸了。
思路
数学题。
其实理论上 可以开到很大。
下文令 ,。
对于两个点的坐标,我们可以把它看成一个四元一次方程组求解,现在的问题是如何找到四个方程。
因为有绝对值,所以我们可以想到取一些极值点来消除绝对值的影响。我们可以想到取 ,,, 中的两个点。
其中不难发现,, 是等价的;, 是等价的,我们这里取 ,。
设 的询问答案为 , 的询问答案为 ,
则有:
于是,我们能求出:
现在我们考虑如何求出 ,这样就可以根据 求出它们的值( 同理)。
不难注意到,根据绝对值的性质,我们设询问为 ,答案为 。
首先,我们先排除 对答案的影响,所以 取 ,答案为 。解得 。
我们要求 ,只要令 即可。
那么,如何找出符合条件的 呢?
注意到当 为中点时,满足上方的式子。又因为我们已经求出了 ,根据中点公式,得 。
所以,答案为 ,解得 .
于是,我们有如下式子:
解得:
同理,不做赘述。
我们发现最后 的搭配不确定,所以先试一次 ,如果有宝藏那么另一个就是 ,否则两个宝藏就是 和 ,总询问次数刚好 次。
代码
CPP//嘻嘻我又改代码了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
cout<<flush;
while(t--)
{
int n,m;
cin>>n>>m;
cout<<"SCAN 1 1"<<endl;
int su;
cin>>su;
su+=4;//x1+x2+y1+y2
int sub;
cout<<"SCAN 1 "<<m<<endl;
cin>>sub;
sub=-m-m+2+sub;//x1+x2-y1-y2
int sux,suy;
sux=su+sub>>1;//x1+x2
suy=su-sub>>1;//y1+y2
int xmid,ymid;
xmid=sux>>1;//中点
ymid=suy>>1;
int subx,suby;
cout<<"SCAN "<<xmid<<' '<<1<<endl;
cin>>subx;
subx=abs(2+subx-suy);//x1-x2
cout<<"SCAN "<<1<<' '<<ymid<<endl;
cin>>suby;
suby=abs(2+suby-sux);//y1-y2
int x1,y1,x2,y2;
x1=sux+subx>>1;
x2=sux-subx>>1;
y1=suy+suby>>1;
y2=suy-suby>>1;
bool f;
cout<<"DIG "<<x1<<' '<<y1<<endl;
cin>>f;
if(f==1)
{
cout<<"DIG "<<x2<<' '<<y2<<endl;
cin>>f;
continue;
}
else
{
cout<<"DIG "<<x1<<' '<<y2<<endl;
cin>>f;
cout<<"DIG "<<x2<<' '<<y1<<endl;
cin>>f;
continue;
}
}
}
相关推荐
评论
共 10 条评论,欢迎与作者交流。
正在加载评论...