记 7.24 阿里巴巴机试题

2023-05-16

题一
 

题目:

吃烧饼大赛。有n个盘子,每个盘子内有s[i]个烧饼。每次选取一个 x(1≤x≤n),可以吃到1 ~ x 号盘子里的一个烧饼。若这1~x个盘子中有空盘时无法进行该操作。

假设小明的食量是无限大,最多可以吃掉多少烧饼。

其实这题主要是n和s[i]的范围都很大,忘记用long类型了(用int会不够用),所以只ac了一部分。

 

思路:

    对每个盘子,最多可吃的数量为:它和它前面的盘子中最少的烧饼数。

用一个变量cur记录到目前盘子为止最少的烧饼数即可。时间复杂度O(n)

代码:


int main(){
    int n = 0;
    cin >> n;
    vector<int> nums(n, 0);
    int min_num = INT_MAX;
    long long ans = 0;
    for(int i = 0; i < n; i++){
        scanf("%d",&nums[i]);
        if (nums[i] < min_num){
            min_num = nums[i];
        }
        ans += min_num;
    }
    cout << ans << endl;
    return 0;
}

 

 

题二

 

题目:
 

开关灯。N行L列的灯,有L个开关,第i个开关Li可以控制第i列,打开该开关使得该列灯状态反转。

行之间可以任意交换,问给定初始灯状态s和目标灯状态t,能否从初始变到目标状态,如果能,最少要打开几个开关。

输入
第一行有一个整数T,表示有多少组测试数据。
每组测试数据包含三行。第一行为两个整数n, L。
每组数据的第二行为n个长度为L的0/1字符串,依次描述起初每行的灯的开关状态。第i个字符串的第j个字符若是’1’,表示对应位置的灯是亮的;’0’表示是灭的。
每组数据的第三行为n个长度为L的0/1字符串,描述主办方希望达到的所有灯的开关状态。格式同上。

输出
输出T行,依次为每组测试数据的答案。如果不可能达到,输出”Impossible”;否则输出最少按多少次开关。

样例输入
3
3 2
01 11 10
11 00 10
2 3
101 111
010 001
2 2
01 10
10 01

样例输出
1
Impossible
0

样例解释
第一组测试数据,按第222列开关,得到 000000 , 101010 , 111111,然后依次交换后两行和前两行即可。
第二组测试数据,可以证明不可能达到要求的方案。
第三组测试数据,只需交换两行即可。

数据范围
40% 的数据:1<=N, L<=10.
100% 的数据:1<=N<=150,1<=L<=50,1<=T<=4.

这题我完全没思路

参考了网上的思路:二进制的做法,利用异或的操作来判断。

我们可以先求出每一行的1/0数组换成十进制是多少(用long long来存),然后我们先枚举原来数组的第一行用最后对应第几行,然后异或出它们的值。这个值就是有哪些不同的地方,即若这个数在二进制下的第i位是1则表示第i列要按。
那我们就对于每一次枚举,就再枚举剩下的数,将它们配对。若不能配对,则这样按不行。若能配对,则找出能配对中所要按次数最少的那一次,就是答案了。
 

 

以下是参考网上的解答:

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long

using namespace std;

ll T, n, l, a[151], b[151], ans;
bool in[151];
char c;

ll getnum(ll x) {//得到二进制
	if (!x) return 1;
	ll sum = getnum(x / 2);
	if (x % 2 == 0) return sum * sum;
	return sum * sum * 2;
}

ll getans(ll x) {//得到要按的个数
	ll sum = 0;
	while (x) {
		if (x % 2 == 1) sum++;
		x /= 2;
	}
	return sum;
}

int main() {
	scanf("%d", &T);//读入
	
	for (int t = 1; t <= T; t++) {
		memset(a, 0, sizeof(a));//初始化
		memset(b, 0, sizeof(b));
		ans = 2147483647;
		
		scanf("%lld %lld", &n, &l);
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= l; j++) {
				c = getchar();
				while (c != '1' && c != '0') c = getchar();
				if (c == '1') a[i] += getnum(l - j);//用二进制存
			}
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= l; j++) {
				c = getchar();
				while (c != '1' && c != '0') c = getchar();
				if (c == '1') b[i] += getnum(l - j);//这个也是用二进制存
			}
		
		for (int i = 1; i <= n; i++) {//找和谁匹配
			bool yes = 0;
			ll dif = a[1] ^ b[i];//异或
			memset(in, 0, sizeof(in));
			in[i] = 1;
			
			for (int j = 2; j <= n; j++) {
				yes = 1;
				for (int k = 1; k <= n; k++)
					if (!in[k] && (ll)(a[j] ^ b[k]) == dif) {//配对
						yes = 0;
						in[k] = 1;
						break;
					}
				if (yes) break;//没得配对
			}
			if (yes) continue;
			
			ans = min(ans, getans(dif));//求出最少要按多少次
		}
		
		if (ans == 2147483647) printf("Impossible\n");//一定按不出来
			else printf("%lld\n", ans);//输出
	}
	
	return 0;
}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记 7.24 阿里巴巴机试题 的相关文章

  • Simulink永磁同步电机控制仿真系列八:使用自抗扰控制(adrc)实现速度闭环以及扰动估计

    引言 最近对环路进行了一些思考 xff0c 我们知道对于永磁同步电机的电流环控制 xff0c 往往假定电流环的控制对象是电阻和电感的串联 xff0c 这样的一个系统开环响应类似于一阶惯性系统 xff0c 适合使用pi控制 xff0c 并且可
  • STM32之RTC实时时钟

    RTC实时时钟简介 STM32的RTC外设 实质是一个掉电后还继续运行的定时器 从定时器的角度来看 相对于通用定时器TIM外设 它的功能十分简单 只有计时功能 也可以触发中断 但是从掉电还能继续运行来看 它是STM32中唯一一个具有这个功能
  • VS2019 错误 MSB8066 自定义生成已退出,代码为 3

    最近使用VS2019调试一个项目 xff0c 一直遇到以下错误 xff1a 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB8066 D MyItems CDMatrix Build CMakeFiles 3800edc586
  • RTOS与linux区别

    一句话解释 xff1a linux是分时系统 xff0c 不过可以通过配置内核改成实时 嵌入式Linux 系统是在原来Linux的发行版本之上进行了优化和改进的 xff0c 用于嵌入式的移动终端等设备的嵌入式Linux系统现在基本上都是实时
  • QT绘图控件QWT的安装及配置

    1 QWT库下载 解压下载的压缩包 xff0c 我们可以看到里面包含多个文件夹 有源码 有参考程序 有说明文档等等 xff0c 有时间建议把参考程序都看一下 xff0c 这样都每个控件有什么功能都很熟悉 2 QWT编译 网上介绍QWT编译有
  • QT多线程的使用(moveToThread方法)

    QT有两种实现多线程的方法 xff0c 一种是 子类化QThread xff0c 然后去重写run函数 xff0c 实现多线程 一种是 子类化QObject xff0c 然后使用moveToThread函数实现多线程 由于QT官方推荐使用第
  • 嵌入式Linux学习1——Linux常用指令1

    写在前面 xff1a Linux本系列的所有学习内容都是我在购买 正点原子Alpha Linux开发板 后 xff0c 根据官方提供的资料 整理而来 后面将不再做介绍 目录 ls xff1a 用于显示当前目录下的内容 a xff1a 显示当
  • 嵌入式Linux学习2——Linux常用指令2

    目录 touch xff1a touch命令用来创建空文件 cp xff1a cp命令用来复制文件或目录 rm xff1a rm命令用于删除一个文件或者目录 mkdir xff1a 用于创建文件夹 mv xff1a mv命令用来为文件或目录
  • 基于STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM

    目录 总体介绍 栈区 xff08 stack xff09 堆区 xff08 heap xff09 全局区 xff08 静态区 xff09 bss段 data段 常量区 代码区 RAM和ROM Flash Memory的物理特性 RAM RO
  • VS2013(Visual Studio 2013)官方中文旗舰版安装激活方法

    dio 2013旗舰版 VS2013 xff08 Visual Studio 2013 xff09 官方中文旗舰版安装激活方法 1 下载后得到的是ISO文件 xff0c 直接解压缩或用虚拟光驱加载运行都可以 2 无所不藏在这里直接解压 xf
  • git服务器(gitea)安装说明

    需要用到的软件 需要用到的软件有 gitea 1 12 3 windows 4 0 amd64 exenssm exeGit 2 28 0 64 bit exe 这些软件的具体功能在后面安装的时候会提及 软件都已经放到了 软件包 文件夹中
  • 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)

    之前分享了很多关于freeRTOS的知识 xff0c 那么我们怎么在实战中去写代码呢 xff1f 本篇文章重在对基于freeRTOS的架构代码的解析 整个功能如下图 xff1a 为什么要用freeRTOS 在实际项目中 xff0c 如果程序
  • FMCW-距离估计

    距离估计 FMCW雷达工作原理 如上图所示 xff0c 圈1是一个信号产生器 xff0c 用于产生一个线性调频脉冲信号 xff08 频率随时间义线性方式增长的正弦波 xff09 xff0c 经圈2发射天线发送出去 xff0c 并且和圈3接收
  • 卡尔曼滤波器从入门到放弃

    目录 前言 个人总结 总结卡尔曼滤波器使用流程 从一维卡尔曼滤波器 不带过程噪声的一维卡尔曼滤波器 EXAMPLE 5 ESTIMATING THE HEIGHT OF A BUILDING 数值例子 xff1a 一维卡尔曼滤波器的完整模型
  • IAR下载算法制作

    IAR下载算法制作 作者 Lucas 时间 2020 12 06 17 06 18 摘要 本文档主要介绍如何在IAR环境下制作QSPI下载算法 本文使用到的硬件 软件如下 编译器 xff1a IAR 8 32 单片机 xff1a STM32
  • clang-format格式化工程代码

    zClang Format 最近在考虑团队代码风格的问题 xff0c 无意间发现了一个代码格式化神器 clang format 工具 在了解clang format工具之前 xff0c 我们先来了解一下什么是clang xff0c 什么是L
  • (转)跟我一起写 Makefile(一)(陈皓)

    本问转载自陈皓大神的跟我一起写 Makefile xff08 一 xff09 概述 什么是makefile xff1f 或许很多Winodws的程序员都不知道这个东西 xff0c 因为那些Windows的IDE都为你做了这个工作 xff0c
  • C语言 volatile的作用与使用场景

    今天完成公司的任务 xff0c 突然想起来在调试过程中遇到了一个问题是这样的 xff1a 我在主函数里面写了一个while xff08 x xff09 的循环 xff0c 想在中断里面去改变这个变量x xff0c 以达到主函数里面退出whi
  • 利用顺序栈(基于数组)实现十进制转换输出其他进制数

    题目 xff1a 利用顺序栈实现将任意10进制数转换成对应的二进制 xff0c 八进制 xff0c 16进制输出 思路 xff1a 利用短除法的原理以及栈先进后出的特点 xff0c 先构建好一个顺序栈 xff0c 这里我用的是数组 xff0

随机推荐