专栏文章
CF2109C1 Hacking Numbers (Easy Version) 解题报告
CF2109C1题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip8yy8x
- 此快照首次捕获于
- 2025/12/03 08:06 3 个月前
- 此快照最后确认于
- 2025/12/03 08:06 3 个月前
题目大意
交互题。 组数据,每组给定一个整数 ,评测机中有一个隐藏的整数 。你可以对这个隐藏的 做出以下四种操作若干次(这里 C1 这道题要求最多 次)将隐藏的 变成 。
add y表示将 增加 ;mul y表示将 乘上 ;div y表示将 除以 ;digit表示将 的十进制各位数字相加,赋值给 ;
在以上的四种操作中,如果假设 操作后得到的数为 ,那么当且仅当 且 为整数时此次操作有效,交互机会返回 ,否则这次操作无效, 不做改变,交互机返回 。
在确定 时给交互机一个指令
! 结束这组数据,这时交互机会返回一个值 (正确)或者 (错误)。解题思路
一种思路为可以将 经过若干次操作后使得 变成我们可以确定的数,然后再经过最多一次操作使得 变为 。这里我们需要保留最后一次将 由我们已知的数字变为 的过程,那么题意就变成了:最多 次操作使得 变成一个确定的数。
那么如何去选取这个确定的数呢?最容易想到的这个确定的数就是 。将 变为 ,显然就是要将 这个数缩小。如何进行缩小?这就锁定了
digit、add 和 div 三种操作。由于 div 操作必须是整除这次操作才有效,所以我们这里不考虑 div 操作。- 第一次缩小:显而易见
digit操作可以将这个范围缩小到更小,于是:; - 第二次缩小:这里再用一次
digit操作可以将范围继续缩小,于是:; - 第三次缩小:注意这里如果再用一次
digit操作最多最多将 缩小到 ,而运用add操作每次可以将范围折半,即add y这里 取 ,这样我们就可以用add -8操作得到:; - 同理可得第四次缩小
add -4得到 ; - 第五次缩小
add -2得到; - 第六次缩小
add -1得到;
六次结束,这里 已经是 ,可以最多一次操作得到 ,这里有个细节:你可以进行
mul n 和 add n-1 两种操作得到 ,但是如果用了后者,你会得到 TLE 的好成绩,原因是当 时,你给出了不合法的操作 add 0,所以避免特判,我选择了前者。单次时间复杂度 。
不要忘记每次输出后清空缓存区哦。
AC Code
这里只放主函数。
CPPsigned main()
{
int T=re();
while(T--)
{
int n=re();
int ci=2;
while(ci--)
{
puts("digit");
cout.flush();
int op=re();
}
puts("add -8");
cout.flush();
int op=re();
puts("add -4");
cout.flush();
op=re();
puts("add -2");
cout.flush();
op=re();
puts("add -1");
cout.flush();
op=re();
printf("mul %d\n",n);
cout.flush();
op=re();
puts("!");
cout.flush();
op=re();
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...