CF745 D 交互题 思维 二进制分解

现有一矩阵
你可以做出不超过20个询问 每个询问 要求输入列号,可以询问矩阵上每行上你给的列之中的最小值
让你最后输出该矩阵每行的不包括对角线位置上的最小值
考虑询问如何分组,考虑二分,以二进制位来分组 那么最多不超过2log(n)次询问就能通过比较得到每行的最小值
注意这里的最重要的问题是如何排除对角线,在比较最小值时,如果当前的行号是对角线上且被包括在当前组中 则抛弃该组结果

 

#include <bits/stdc++.h>
using namespace std;

int n;
int a[1010];
int mi[1010];
int main()
{
	memset(mi, 0x3f, sizeof(mi));
	scanf("%d", &n);
	int f = 0;
	int x = 0;
	while((1 << x) <= n)
	{
		int cnt = 0;
		for(int i = 1; i <= n; i++)
			if( ((i >> x) & 1) == f)
				cnt++;
		if(!cnt)
			continue;
		printf("%d\n", cnt);
		for(int i = 1; i <= n; i++)
			if(((i >> x) & 1) == f)
				printf("%d ", i);
		printf("\n");
		fflush(stdout);
		for(int i = 1; i <= n; i++)
		{
			int t;
			scanf("%d", &t);
			if(((i >> x) & 1) != f)
				mi[i] = min(mi[i], t);
		}
		f^=1;
		if(f == 0)
			x++;
	}
	printf("-1\n");
	for(int i = 1; i <= n; i++)
		printf("%d%s", mi[i], i==n?"\n":" ");
	fflush(stdout);

}

转载于:https://www.cnblogs.com/Yumesenya/p/7449900.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是汇编语言中将二进制转换为十进制的示例代码: ``` section .data binary dw 10101101b ; 二进制数 section .bss decimal resb 5 ; 存储十进制数的缓冲区 section .text global _start _start: mov ax, [binary] ; 将二进制数加载到寄存器 mov bx, 10 ; 将除数加载到寄存器 mov di, decimal ; 设置存储十进制数的缓冲区地址 ; 将二进制数转换为十进制数 xor cx, cx ; 清空 cx 寄存器 loop: rcr ax, 1 ; 将二进制数右移一位,最高位放入 CF 标志位 adc cl, 0 ; 将 CF 标志位的值加到 cx 寄存器 cmp ax, 0 ; 如果二进制数为 0,跳出循环 jne loop ; 将十进制数存储到缓冲区 mov bx, 10 ; 将除数加载到寄存器 mov si, decimal + 4 ; 设置存储十进制数的缓冲区地址,从高位向低位存储 store: xor dx, dx ; 清空 dx 寄存器 div bx ; 将十进制数除以 10,商存储在 ax 寄存器中,余数存储在 dx 寄存器中 add dl, '0' ; 将余数转换为 ASCII 码 mov [si], dl ; 将余数存储到缓冲区 dec si ; 缓冲区地址减 1 cmp ax, 0 ; 如果十进制数为 0,跳出循环 jne store ; 输出十进制数 mov eax, 4 ; 调用系统调用 write mov ebx, 1 ; 文件描述符 stdout mov ecx, decimal ; 缓冲区地址 mov edx, 5 ; 输出的字节数 int 0x80 ; 执行系统调用 ; 退出程序 mov eax, 1 ; 调用系统调用 exit xor ebx, ebx ; 返回值为 0 int 0x80 ; 执行系统调用 ``` 上述代码将二进制数10101101b转换为十进制数173,并将结果存储到缓冲区中输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值