电子科技大学链时代工作室招新题C语言部分---题号G
1. 题目
问题的第一段也是非常逆天,说实话,你编不出问题背景可以不编。
这道题的大概意思就是, Pia要去坐飞机,那么行李就有限重。这时Pia想到自己带了个硬盘,众所周知,硬盘上存储的数据就是0和1的二进制序列。
对于一段二进制序列,每有一个从0到1的过渡,或是从1到0的过渡(也就是每有一个0和1的分界),就会导致硬盘的重量轻微增加一点,为了不超重,Pia就需要修改一下硬盘上存储的数据。
然而硬盘上的某些位置是坏掉的,坏掉的位置只能存入0,其中,第一个位置永远是好的,最后一个位置永远是坏的。
输入
第一行,分别输入三个数n,c,b(2<=n<=5.,1<=c,b<=n-1)。
n表示二进制序列的长度,c表示所需分界位置的数量,b表示损坏位置的个数。
第二行输入损坏位置的位置信息。
输出
输出符合条件的二进制序列。
2. 第一版解法
2.1 思路
1. 首先我们肯定需要依据n开辟一个数组,但接下来我们就有两种选择,将数组元素全部初始化为0或全部初始化为1。
2. 如果我们将数组全部初始化为0,那么我们在将某个元素改为1时,需要先检查其是否为损坏的位置,每次都需要遍历储存位置信息的数组。
3. 如果我们将数组初全部始化为1,那么我们只需要在初始化结束之后把损坏的位置改为0即可,并在之后的过程中,确保只将1改为0,而不将0改为1。
4. 第一个位置始终是好的,最后一个位置始终是坏的。这个条件对边界上的位置进行了限制,边界上的位置有什么特殊的吗?
我们发现,边界上出现1,最多只会导致1次变化,而中间位置上出现1(不与边界1相连),一定会导致2次变化。
所以,如果题上要求的变化次数为奇数,那么一号位一定是1;如果题上要求的变化次数为偶数,则一号位上一定不是1。
add原本指向数组开头,这里将与一号位相连的1都抛开不看了(有问题,下一版会该)
if(c%2 == 0)
{bit[0] = '0';
}
else
{bit[0] = '1';c--;//所需减一while(*(++add) == '1');
}
5. 在将一号位调整好之后就可以先将其抛开不看了,将add当作数组开头进行进一步调整。
6. 接下来我们的做法是记录每一段1的起始与结束位置,如果当前发生字节改变的位置比要求的少,那么就将某一段1分割为两段,中间用0隔开;如果当前发生字节改变的位置比要求的多,那么就将某一段1全部置为0。
2.2 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct posi
{char* start;char* end;
}posi;int main()
{int n = 0, c = 0, b = 0, count = 0;//硬盘大小,所需字节改变处数量,受损坏字节数量,1的段数char sep[] = {'0'};scanf("%d %d %d", &n, &c, &b);char* bit = (char*)malloc(sizeof(char) * (n + 1));//存结果bit[n] = '\0';bit[n-1] = '0';char* add = bit;for(int i = 0; i < n - 1; i++){bit[i] = '1';}int* Bre = (int*)malloc(sizeof(int) * b);//损坏字节的位置for(int i = 0; i < b; i++){scanf("%d", &Bre[i]);bit[Bre[i]-1] = '0';}if(c%2 == 0){bit[0] = '0';}else{bit[0] = '1';c--;//所需减一while(*(++add) == '1');}posi* ret = (posi*)malloc(sizeof(posi) * n / 2);for(ret[count].start = strtok(add, sep); ret[count].start != NULL; ret[++count].start = strtok(NULL, sep))//记录每段1的起始和结束位置{char* tmp = ret[count].start;while(*tmp != '\0'){tmp++;}ret[count].end = tmp - 1;}int i = 0;if(count == 0){if(add >= bite + 3&&2 * count != c)//1111110{bit[1] = '0';ret[count].start = bite + 2;ret[count].end = add - 1;count++;}else//10000000{printf("%s\n", bit);free(bit);free(Bre);free(ret);return 0;}}while(2 * count < c&&i < n / 2)//改变的少了{if(ret[i].end - ret[i].start >= 2){*(ret[i].start + 1) = '0';ret[count].start = ret[i].start + 2;ret[count].end = ret[i].end;count++;ret[i].end = ret[i].start + 1;}else{i++;}}while(2 * count > c&&i < n / 2)//改变的多了{while(ret[i].start <= ret[i].end){*(ret[i].start++) = '0';*(ret[i].end--) = '0';}i++;count--;}for(int j = 0; j < n; j++){if(bit[j] == '\0')bit[j] = '0';}printf("%s\n", bite);free(bit);free(Bre);free(ret);return 0;
}
2.3 总结
这一段代码的问题就在于add那里,将开头连续的1一并忽视掉。
这就会导致需要单独处理一开始就只有开头连续1的情况,我们已经说过,当你开始考虑特殊情况时,你就已经输了一半。
不止如此,这还会导致我们能产生的最多字节变化的数量减少,因为开头的连续1也可以断开产生更多变化字节。
3. 最终版解法
3.1 思路
这一版就将add给删除了,当b为奇数时,将一号位置为1,然后直接将二号位置为0。
这样做就可以达到目的了,而且无需考虑特殊情况,可以说add这个变量简直是画蛇添足。
3.2 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct posi
{char* start;char* end;
}posi;int main()
{int n = 0, c = 0, b = 0, count = 0;//硬盘大小,所需字节改变处数量,受损坏字节数量,1的段数char sep[] = {'0'};scanf("%d %d %d", &n, &c, &b);char* bit = (char*)malloc(sizeof(char) * (n + 1));//存结果bit[n] = '\0';bit[n-1] = '0';for(int i = 0; i < n - 1; i++){bit[i] = '1';}int* Bre = (int*)malloc(sizeof(int) * b);//损坏字节的位置for(int i = 0; i < b; i++){scanf("%d", &Bre[i]);bit[Bre[i]-1] = '0';}if(c%2 == 0){bit[0] = '0';}else{bit[0] = '1';bit[1] = '0';c--;//所需减一}posi* ret = (posi*)malloc(sizeof(posi) * n / 2);for(ret[count].start = strtok(bite + 1, sep); ret[count].start != NULL; ret[++count].start = strtok(NULL, sep))//记录每段1的起始和结束位置{char* tmp = ret[count].start;while(*tmp != '\0'){tmp++;}ret[count].end = tmp - 1;}int i = 0;while(2 * count < c&&i < n / 2)//改变的少了{if(ret[i].end - ret[i].start >= 2){*(ret[i].start + 1) = '0';ret[count].start = ret[i].start + 2;ret[count].end = ret[i].end;count++;ret[i].end = ret[i].start + 1;}else{i++;}}while(2 * count > c&&i < n / 2)//改变的多了{while(ret[i].start <= ret[i].end){*(ret[i].start++) = '0';*(ret[i].end--) = '0';}i++;count--;}for(int j = 0; j < n; j++){if(bit[j] == '\0')bit[j] = '0';}printf("%s\n", bit);free(bit);free(Bre);free(ret);return 0;
}
3.3 总结
还是那句话,当你的代码需要考虑特殊输入情况时,你就要想办法改改它了,尽管它看起来万无一失。
相关文章:
电子科技大学链时代工作室招新题C语言部分---题号G
1. 题目 问题的第一段也是非常逆天,说实话,你编不出问题背景可以不编。 这道题的大概意思就是, Pia要去坐飞机,那么行李就有限重。这时Pia想到自己带了个硬盘,众所周知,硬盘上存储的数据就是0和1的二进制序…...
体育运动直播中的智能运动跟踪和动作识别系统 - 视频分析如何协助流媒体做出实时决策
AI-Powered Streaming Vision: Transforming Real-Time Decisions with Video Analytics 原著:弗朗西斯科冈萨雷斯|斯特朗(STRONG)公司首席ML科学家 翻译:数字化营销工兵 实时视频分析通过即时处理实时视频数据&…...
Avalon总线学习
Avalon总线学习 avalon总线可以分为: Avalon clock interface Avalon reset interface Avalon Memory mapped interface Avalon iterrupt interface Avalon streaming interface Avalon tri-state conduit interface Avalon conduit interface 1、Avalon c…...
Sentinel(熔断规则)
慢调用比例 慢调用比例( SLOM_REQUEST_RATTo ):选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,…...
Hive借助java反射解决User-agent编码乱码问题
一、需求背景 在截取到浏览器user-agent,并想保存入数据库中,经查询发现展示的为编码后的结果。 现需要经过url解码过程,将解码后的结果保存进数据库,那么有几种实现方式。 二、问题解决 1、百度:url在线解码工具 …...
Linux下安装Android Studio及创建桌面快捷方式
下载 官网地址:https://developer.android.com/studio?hlzh-cn点击下载最新版本即可 安装 将下载完成后文件,进行解压,然后进入android-studio-2023.2.1.23-linux/android-studio/bin目录下,启动studio.sh即可为了更加方便的使…...
【析】一类动态车辆路径问题模型和两阶段算法
一类动态车辆路径问题模型和两阶段算法 摘要 针对一类动态车辆路径问题,分析4种主要类型动态信息对传统车辆路径问题的本质影响,将动态车辆路径问题(Dynamic Vehicle Routing Problem, DVRP)转化为多个静态的多车型开放式车辆路径问题(The Fleet Size a…...
从基础入门到学穿C++
前言知识 C简介 C是一门什么样的语言,它与C语言有着什么样的关系? C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解…...
代码随想录算法训练营第二十四天|leetcode78、90、93题
一、leetcode第93题 class Solution { public:vector<string> restoreIpAddresses(string s) {int n s.size();vector<string> res;function<void(string, int, int)> dfs [&](string ss, int idx, int t) -> void {// 终止条件,枚举完&…...
Java学习笔记NO.20
Java流程控制 1. 用户交互 Scanner Java中的Scanner类用于获取用户输入,可以从标准输入(键盘)读取各种类型的数据。 import java.util.Scanner; public class UserInputExample { public static void main(String[] args) { Scanner sc…...
关系型数据库mysql(1)基础认知和安装
目录 一.数据库的基本概念 1.1数据 1.2表 1.3数据库 1.4 DBMS 数据库管理系统 1.4.1基本功能 1.4.2优点 1.4.3DBMS的工作模式 二.数据库的发展历史 2.1发展的三个阶段 第一代数据库 第二代数据库 第三代数据库 2.2mysql发展历史 三.主流数据库 四.关系型数据库和…...
WanAndroid(鸿蒙版)开发的第三篇
前言 DevEco Studio版本:4.0.0.600 WanAndroid的API链接:玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考: 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …...
全国农产品价格分析预测可视化系统设计与实现
全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会,数据的可视化已成为决策和分析的重要工具。尤其是在农业领域,了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求,设计并实现了全国农产…...
堆排序(数据结构)
本期讲解堆排序的实现 —————————————————————— 1. 堆排序 堆排序即利用堆的思想来进行排序,总共分为两个步骤: 1. 建堆 • 升序:建大堆 • 降序:建小堆 2. 利用堆删除思想来进行排序. 建堆和堆删…...
使用DMA方式控制串口
本身DMA没什么问题,但是最后用GPIOB点灯,就是点不亮。 回到原来GPIO点灯程序,使用GPIOB就是不亮,替换为GPIOA就可以,简单问题总是卡得很伤。...
ModbusTCP转Profinet网关高低字节交换切换
背景:在现场设备与设备通迅之间通常涉及到从一种字节序(大端或小端)转换到另一种字节序。大端字节序是指高位字节存储在高地址处,而小端字节序是指低位字节存储在低地址处。在不动原有程序而又不想或不能添加程序下可选用ModbusTC…...
OpenvSwitch VXLAN 隧道实验
OpenvSwitch VXLAN 隧道实验 最近在了解 openstack 网络,下面基于ubuntu虚拟机安装OpenvSwitch,测试vxlan的基本配置。 节点信息: 主机名IP地址OS网卡node1192.168.95.11Ubuntu 22.04ens33node2192.168.95.12Ubuntu 22.04ens33 网卡信息&…...
GPT能复制人类的决策和直觉吗?
GPT-3能否复制人类的决策和直觉? 近年来,像GPT-3这样的神经网络取得了显著进步,生成的文本几乎与人类写作内容难以区分。令人惊讶的是,GPT-3在解决数学问题和编程任务方面也表现出色。这一显著进步引发了一个问题:GPT…...
权限设计种类【RBAC、ABAC】
ACL 模型:访问控制列表 DAC 模型:自主访问控制 MAC 模型:强制访问控制 ABAC 模型:基于属性的访问控制 RBAC 模型:基于角色的权限访问控制 一、简介前三种模型: 1.1 ACL(Access Control L…...
C语言经典面试题目(十九)
1、什么是C语言?简要介绍一下其历史和特点。 C语言是一种通用的高级计算机编程语言,最初由贝尔实验室的Dennis Ritchie在1972年至1973年间设计和实现。C语言被广泛应用于系统编程、应用程序开发、嵌入式系统和操作系统等领域。它具有高效、灵活、可移植…...
VSCode 远程调试C++程序打开/dev/tty设备失败的问题记录
概述 因为需要协助同事调试rtklib中的rtkrcv程序,一直调试程序都是用了vscode,这次也不例外,但是在调试过程中,发现程序在打开当前终端(/dev/tty)的时候,总是打开失败,返回的错误原因是“No such device o…...
亮相AWE 2024,日立中央空调打造定制空气新体验
日立中央空调于3月14日携旗下空气定制全新成果,亮相2024中国家电及消费电子博览会(简称AWE 2024)现场,围绕“科创先行 智引未来”这一主题,通过技术与产品向行业与消费者,展现自身对于家居空气的理解。 展会…...
KY61 放苹果(用Java实现)
描述 把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? 注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。 输入描述: 输入包含多组数据。 每组数据包含两个正整…...
原型模式(Clone)——创建型模式
原型模式(clone)——创建型模式 什么是原型模式? 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需依赖它们所属的类。 总结:需要在继承体系下,实现一个clone接口,在这个方法中以本身作为拷…...
<.Net>VisaulStudio2022下用VB.net实现socket与汇川PLC进行通讯案例(Eazy521)
前言 此前,我写过一个VB.net环境下与西门子PLC通讯案例的博文: VisaulStudio2022下用VB.net实现socket与西门子PLC进行通讯案例(优化版) 最近项目上会用到汇川PLC比较多,正好有个项目有上位机通讯需求,于是…...
漫途桥梁结构安全监测方案,护航桥梁安全!
桥梁作为城市生命线的重要组成部分,承载着城市交通、物流输送、应急救援等重要职能。然而,随着我国社会经济的飞速发展,桥梁所承载的交通流量逐年增长,其安全性所面临的挑战亦日益严峻。例如恶劣的外部环境、沉重的荷载以及长期使…...
LAMP架构部署--yum安装方式
这里写目录标题 LAMP架构部署web服务器工作流程web工作流程 yum安装方式安装软件包配置apache启用代理模块 配置虚拟主机配置php验证 LAMP架构部署 web服务器工作流程 web服务器的资源分为两种,静态资源和动态资源 静态资源就是指静态内容,客户端从服…...
关于PXIE3U18槽背板原理拓扑关系
如今IT行业日新月异,飞速发展,随之带来的是数据吞吐量的急剧升高。大数据,大存储将成为未来数据通信的主流,建立快速、大容量的数据传输通道将成为电子系统的关键。随着集成技术和互连技术的发展,新的串口技术…...
网络安全等保测评指标一览表
什么是等保? 等保是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安全事件分等级响应、处…...
C语言中函数的递归
在C语言中,递归是一种解决问题的方法,其中函数直接或间接地调用自身来解决问题。递归通常用于解决那些可以分解为更小、更简单的同类问题的问题。递归有两个关键部分:基本情况(base case)和递归情况(recurs…...
做招聘网站价格/自助建站网站模板
目录 零、前言 一、算法思想 二、实现思路 四、源码 零、前言 今天我学习了二分查找(折半查找法),它是用于在有序集合中查找某一元素的便捷算法;算法思想易于理解,很多同学看了就觉得自己会了,但是约易…...
做动态网站可以不写代码吗/百度提交入口网址截图
前言本文通过四种方式来告诉你如何使用,虽然有一种被放弃了。今日早读文章由老虎集团joking_zhang翻译授权分享。正文从这开始~~使用 React 时,我们的默认思维方式应该是 不会强制修改 DOM ,而是通过传入 props 重新渲…...
自助建站整站源码/湖南网站推广优化
2019独角兽企业重金招聘Python工程师标准>>> 问题1 : 新建了一个简单的工程,打包成release 包,并使用androidpluginmgr 来加载。发现启动了在宿主中的代理Activity 界面。而且宿主程序也意外停止了。 log发现,在 Plugi…...
wordpress 加密连接/google商店
几乎所有的 Flink 应用程序(包括批处理与流处理程序)都需要依赖外部配置参数。例如,可以用来指定输入和输出源(如路径或者地址),系统参数(并发数,运行时配置)以及应用程序特定参数(通常用在自定义函数中)。从 0.9 版本开始,Flink …...
wordpress 格子主题/公司建网站需要多少钱
1. lambda 表达式和 def 语句是如何联系的? 答:lambda 和 def 都创建稍后要调用的函数对象。 但是,因为lambda是一个表达式,它返回一个函数对象而不是将其赋值给一个名称,它可以用于在一个 def 语法不起作用的地方嵌套…...
新疆生产建设兵团体育局网站/友链通
联合也是一种新的数据类型, 它是一种特殊形式的变量。 联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 在联合变量lgc中, 整型量i和字符mm公用同一内存位置。 当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度 联合访问其成…...