这是一个交互题 有n×m的矩阵,里面有两个宝藏,你可以进行两种操作:
第一个是SCAN(x,y),返回两个宝藏到点(x,y)的曼哈顿距离(|x-x|+|y-y|)
第二个是DIG(x,y),如果有坐标有宝藏,返回1,否则返回0,当返回两个1时,成功找到两个宝藏
你最多可以操作7次
这个题是一次多的机会也不给,七次都是要跑满的,但是感觉这个题也是挺套路的,绝对值一般都是找两个锻炼就可以去掉了,然后分析就很简单了。
1. 首先需要询问四个端点中的相邻两个,然后就可以推出另外两个端点的值
2. 当行,或者列固定时,沿着一个方向移动,曼哈顿距离的变化趋势一定如下:

3. 因此我们只需要询问上图平面的中点即可,解方程就可以解出x1,x2

4 .同理,对于y坐标,也需要询问一次,即可得到y1,y2,那么现在的总次数为 4
5. 由于不知道x,y两两如何对应,因此,需要DIG测试一次,因此最多需要DIG三次,最少DIG两次,总数6-7次
#include<bits/stdc++.h>
using namespace std;
int n, m;
int f[10];
int X1, Y1, X2, Y2;//X1<X2,Y1<Y2
void run() {
cin >> n >> m;
cout << "SCAN " << 1 << ' ' << 1 << endl;
cin >> f[1];
cout << "SCAN " << 1 << ' ' << m << endl;
cin >> f[2];
f[3] = (f[1] + f[2] - 2 * m + 6) / 2;//a+c
f[4] = (f[1] - f[2] + 2 + 2 * m) / 2;//b+d
f[5] = 2 * n - f[3] + f[4] - 2;
int res = (f[2] - f[1]) / 2;
int mid = (m - res + 1) / 2;
cout << "SCAN " << 1 << ' ' << mid << endl;
cin >> f[6];//中点
Y1 = (f[1] - f[6]) / 2 + 1;
Y2 = f[4] - Y1;
res = (f[5] - f[1]) / 2;
mid = (n - res + 1) / 2;
cout << "SCAN " << mid << ' ' << 1 << endl;
cin >> f[7];//中点
X1 = (f[1] - f[7]) / 2 + 1;
X2 = f[3] - X1;
cout << "DIG " << X1 << ' ' << Y1 << endl;
cin>>res;
if(res){
cout << "DIG " << X2 << ' ' << Y2 << endl;
cin>>res;
}
else{
cout << "DIG " << X1 << ' ' << Y2 << endl;
cin>>res;
cout << "DIG " << X2 << ' ' << Y1 << endl;
cin>>res;
}
}
int main() {
int t;
cin >> t;
while (t--)
run();
return 0;
}
题外话:抑郁场,开局一小时只出A,死活想不来B,最后因为D题出锅ura才保住可怜的分。但咱本来就写不到DB-LongLegs(数论)本题题解法一学自同样抑郁的知乎作者幽血魅影的题解,有讲解原理。法二来着知乎巨佬cup-pyy(大佬说《不难发现》呜呜)题意三种操作:向上走mmm步向右走mmm步给自己一次走的步数加111,即使得m=m+1m=m+1m=m+1问从(0,0)(0,0)(0,0)走到(a,b)(a,b)(a,b)的最小操作次数,值得注意的是操作三不可逆。解析假设我们最终一步的大小增长到mmm,那么在这个过程中我能以[1,m][1,m][1,m](当步数增长到该数时)之间的任何数字向上或
A.Yura'sNewName题意:给出一个仅由_或^组成的字符串,你可以在任意位置添加_或^字符,使得字符串满足:任意字符要么属于^_^的一部分,要么属于^^的一部分。求最少添加的字符数量。分析:对于_我们只需处理没有组成^_^的_:①如果_在首位置且左边没有^则添加^②如果_在尾位置且右边没有^则添加^③如果_在中间部分且右边没有^则添加^当字符串只有一个^时末尾添加一个^code:#includeusingnamespacestd;intmain(){ std::ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); intt; cin
目录A.Garland(签到)题面翻译思路:代码B.PointsonPlane(数学)题面翻译思路:代码C.SumonSubarray(构造)题面翻译:思路:代码D.BinaryStringSorting题面翻译思路:代码A.Garland(签到)Youhaveagarlandconsistingof 4 coloredlightbulbs,thecolorofthe i-thlightbulbis si.Initially,allthelightbulbsareturnedoff.Yourtaskistoturnallthelightbulbson.Youcanperformthefollo
目录A.Garland(签到)题面翻译思路:代码B.PointsonPlane(数学)题面翻译思路:代码C.SumonSubarray(构造)题面翻译:思路:代码D.BinaryStringSorting题面翻译思路:代码A.Garland(签到)Youhaveagarlandconsistingof 4 coloredlightbulbs,thecolorofthe i-thlightbulbis si.Initially,allthelightbulbsareturnedoff.Yourtaskistoturnallthelightbulbson.Youcanperformthefollo
视频讲解:TBDA.ThreeDoors题目大意有333个门和333把对应的钥匙。其中222把钥匙分别在222扇门后,111把在手上。打开门才能获得门后的钥匙,问能否打开所有的门。题解判断前两次开的门后,是否有钥匙即可。参考代码#includeusingnamespacestd;typedeflonglongll;intmain(){ intT,x,a[5],now; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&x,&a[1],&a[2],&a[3]); now=3^2^1^a[1]^a[2]^a[3]; if(a[now]==0||a[
视频讲解:TBDA.ThreeDoors题目大意有333个门和333把对应的钥匙。其中222把钥匙分别在222扇门后,111把在手上。打开门才能获得门后的钥匙,问能否打开所有的门。题解判断前两次开的门后,是否有钥匙即可。参考代码#includeusingnamespacestd;typedeflonglongll;intmain(){ intT,x,a[5],now; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&x,&a[1],&a[2],&a[3]); now=3^2^1^a[1]^a[2]^a[3]; if(a[now]==0||a[
A.Two0-1Sequences 大致翻译:两个长度为n和m的二进制序列a和b(题目保证n>=m)两个操作:op1: 改变a(2)为min(a(1),a(2)),并且移除a(1)op2: 改变a(2)为max(a(1),a(2)),并且移除a(1)每次操作后,原先的a(i)变成a(i+1),长度减少1,即前移。 a二进制序列能否通过这两个操作变成b二进制序列?解题思路:刚开始想的是判断a2后缀跟a1后缀是否相同,再判断,a1前面有没有1和0(因为有1和0,就表示op1和op2可以随意完成)。写的时候又陆陆续续发现需要几个特判,想a1长度为1等。于是就debug,慢慢发现只要前面有a2的第一
A.Two0-1Sequences 大致翻译:两个长度为n和m的二进制序列a和b(题目保证n>=m)两个操作:op1: 改变a(2)为min(a(1),a(2)),并且移除a(1)op2: 改变a(2)为max(a(1),a(2)),并且移除a(1)每次操作后,原先的a(i)变成a(i+1),长度减少1,即前移。 a二进制序列能否通过这两个操作变成b二进制序列?解题思路:刚开始想的是判断a2后缀跟a1后缀是否相同,再判断,a1前面有没有1和0(因为有1和0,就表示op1和op2可以随意完成)。写的时候又陆陆续续发现需要几个特判,想a1长度为1等。于是就debug,慢慢发现只要前面有a2的第一
详情请见:CSDN阿史大杯茶 https://blog.csdn.net/weixin_66946161/article/details/126093709题目意思本题主要意思就是切成一个个小块(小块的面积相同,但小块不相同),使小块之间互不相等,而且旋转之后相同,也算小块相同!例:ABCACDDB这两个是相同的!最后输出一共可以有多少种切法,使他们互不相等,然后输出切出的最小块(这里要注意如果面积相等,则输出a小的那一个)比如说:和,是要输出!思路:这道题主要就是取块以及旋转判断:取块:这个很简单,只需双重for循环,不停的枚举中的a和b,如果a或b不能被N或M整除,那么是不行的所以要co
详情请见:CSDN阿史大杯茶 https://blog.csdn.net/weixin_66946161/article/details/126093709题目意思本题主要意思就是切成一个个小块(小块的面积相同,但小块不相同),使小块之间互不相等,而且旋转之后相同,也算小块相同!例:ABCACDDB这两个是相同的!最后输出一共可以有多少种切法,使他们互不相等,然后输出切出的最小块(这里要注意如果面积相等,则输出a小的那一个)比如说:和,是要输出!思路:这道题主要就是取块以及旋转判断:取块:这个很简单,只需双重for循环,不停的枚举中的a和b,如果a或b不能被N或M整除,那么是不行的所以要co