当前位置: 首页 > news >正文

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目

  这道题大概的意思是说,一座城市中被埋了许多雷(用一个只含0和1的字符串表示城市,1代表有雷,0代表无雷)。

你作为一个排雷兵,需要花最少的钱引爆所有的雷来使城市中不再有雷(太逆天了,不知道是不是我理解错了,但总之就是要少花钱,还要引爆所有雷)。

当一个雷被引爆时,相邻的雷都会爆炸,所以你可以选择在没有雷的地方埋雷,使得两片雷区连起来,这样你就可以只花一次引爆需要的钱来引爆两片雷区。当然,埋雷也要花钱,不过在大多数案例中,埋雷的花费会较少。

输入

第一行输入一个整形t(1<=t<=100000),表示接下来需要进行几轮排雷。

对于每一次排雷,第一行分别输入引爆雷和埋雷的花费(a和b, 且1<=a,b<=1000),第二行输入一个只含0和1的字符串,表示城市中埋雷的情况。

对于每次测试,各轮排雷输入的字符串的总长度不会超过100000。

输出

依次输出每轮排雷的最低花费。

例如,题中所给的例子的第二轮排雷

引爆的花费是5,埋雷的花费是1

城市中雷的情况是01101110

于是选择将两片雷区连起来(在第四个位置上埋雷),再进行引爆,总花费是6。


2. 第一版解法

 这一版并不完全算作第一版,其实是第二版。由于第一版老是通不过,于是我气急败坏地写了个暴力解法

2.1 思路

1. 最前端的0不需要考虑,因为在这这里埋雷毫无意义,于是先将字符串缩短一下,使得字符串以1开头。

2. 最后段其实也同样不需要考虑,但第一版的解法能够直接无视掉最后一段零(如果有的话)。

3. 除开这两段无需考虑的零,其他每一段零我们都需要考虑是否要埋雷来链接雷区。判断是否要埋雷的逻辑也很简单,因为链接一次雷区可以使我少引爆一次,所以就判断是埋雷花费高,还是多引爆一次花费高。

4. 在不考虑最后一段零的情况下,雷区数一定比零的段数多一,当每次决定不埋雷时,无雷区的数量加加,雷区数量就是无雷区数量加一。

5. 遍历字符串,用if语句来具体处理每一种情况。

2.2 代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{int n = 0;scanf("%d", &n);int* num = (int*)malloc(sizeof(int) * n);for(int i = 0; i < n; i++){int a = 0, b = 0, count = 0, j = 1, a_num = 1,b_num = 0, flag1 = 1, flag2 = 0;char* ret = NULL;char arr[100000] = {0};scanf("%d%d", &a, &b);getchar();while((arr[0] = getchar()) == '0');while((arr[j++] = getchar()) != '\n'){flag1 = 0;}if(flag1){num[i] = 0;continue;}for(int i = 1; i < j; i++){if(arr[i] == '1'&&arr[i-1] == '0')//a数量加一,结算前方0{if(a <= b * count)a_num++;elseb_num = count;count = 0;}else if(arr[i] == '1'&&arr[i-1] == '1')//连续一无意义{;}else if(arr[i] == '0'&&arr[i-1] == '1')//开始统计零{count++;flag2 = 1;}else if(arr[i] == '0'&&arr[i-1] == '0'&&flag2)//连续零统计{count++;}}if(a_num == 0){num[i] = 0;continue;}num[i] = a_num * a + b_num * b;}for(int i = 0; i < n; i++){printf("%d\n", num[i]);}free(num);return 0;
}

2.3 总结

前面已经说了,这是一气之下写出来的破罐子破摔写法,没有什么参考意义。

经过这几天的做题,我发现,当你开始用if语句来处理各种特殊情况时,你就失败一半了。


3. 最终版解法

这一版才是严格意义上的第一版,只不过之前由于许多画蛇添足的操作导致程序老是通不过。后来上面那一版也过不了,我又回来继续改这一版,删掉了几句就过了。

3.1 思路

1. 这一版与上一版的不同在于,上一版采用的是依次遍历数组,用if语句逐个处理每个元素的方法;这一版采用了函数strtok。

2. 我们的目的其实就是找到两端都是1的无雷区,那么我们完全可以用strtok函数来将字符串分割出一个个的连续0段,然后判断是否要埋雷。

3. 这一次我们需要将尾端的无雷区也消减掉。

3.2 代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{int n = 0;scanf("%d", &n);int* num = (int*)malloc(sizeof(int) * n);for(int i = 0; i < n; i++){int a = 0, b = 0, count = 1, coin = 0, kong = 0, j = 0, flag1 = 1, flag2 = 1;char* ret = NULL;char arr[100006] = {0};char* sep = "1";scanf("%d%d", &a, &b);getchar();while((arr[j] = getchar()) != '\n'){if(arr[j] == '1')flag1 = 0;if(arr[j] == '0')flag2 = 0;j++;}if(flag1){num[i] = 0;continue;}if(flag2){num[i] = a;continue;}char* e = arr;char* f = arr + j - 1;while(*e == '0'&&e <= f){e++;};while(*f == '0'&&e <= f){f--;};*f = '\0';for(ret = strtok(e, sep); ret != NULL; ret = strtok(NULL, sep)){int len = strlen(ret);if(len*b < a){coin += len*b;}else{kong++;}}coin += (kong+1) * a;num[i] = coin;}for(int i = 0; i < n; i++){printf("%d\n", num[i]);}free(num);return 0;
}

3.3 总结

能用通用算法的,绝不用if语句来处理特使情况。

所以千万不要放弃一个较好的算法而去尝试暴力解法。

相关文章:

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目 这道题大概的意思是说&#xff0c;一座城市中被埋了许多雷&#xff08;用一个只含0和1的字符串表示城市&#xff0c;1代表有雷&#xff0c;0代表无雷&#xff09;。 你作为一个排雷兵&#xff0c;需要花最少的钱引爆所有的雷来使城市中不再有雷&#xff08;太逆天了&a…...

K8S CNI

OCI概念 OCI&#xff0c;Open Container Initiative&#xff0c;开放容器标准&#xff0c;是一个轻量级&#xff0c;开放的治理结构&#xff08;项目&#xff09;&#xff0c;在 Linux 基金会的支持下成立&#xff0c;致力于围绕容器格式和运行时创建开放的行业标准。 OCI 项目…...

Python数据分析实验一:Python数据采集与存储

目录 一、实验目的与要求二、实验过程三、主要程序清单和运行结果1、爬取 “中国南海网” 站点上的相关信息2、爬取天气网站上的北京的历史天气信息 四、程序运行结果五、实验体会 一、实验目的与要求 1、目的&#xff1a; 理解抓取网页数据的一般处理过程&#xff1b;熟悉应用…...

丘一丘正则表达式

正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式正则表达式是一种通用的字符串表达框架正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具正则表达式可以用来判断某字符串的特征归属 正则表达式常用操作符 操作符说明实…...

工业物联网平台在水务环保、暖通制冷、电力能源等行业的应用

随着科技的不断发展&#xff0c;工业物联网平台作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为推动各行业智能化转型的关键力量。在水务环保、暖通制冷、电力能源等行业&#xff0c;工业物联网平台的应用尤为广泛&#xff0c;对于提升运营效率、降低能耗、优化管理等…...

【研发日记】Matlab/Simulink技能解锁(二)——在Matlab Function编辑窗口Debug

文章目录 前言 行断点 条件断点 按行步进 Watch Value 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时&#xff0c;如果能确定大致的代码段&#xff0c;就可以在相应的行上设置一…...

从键盘输入两个数,求它们的和并输出 从键盘输入三个数到a,b,c中,按公式值输出

别急别急&#xff0c;先看完 (从初学者出发&#xff09; 从键盘输入两个数&#xff0c;求它们的和并输出 作者 陈春晖 单位 浙江大学 本题目要求读入2个整数A和B&#xff0c;然后输出它们的和。 输入格式: 在一行中给出一个被加数 在另一行中给出一个加数 输出格式: 在…...

密码解密 C卷(100%用例)(JavaPythonC++Node.jsC语言)

给定一段“密文“字符串s,其中字符都是经过"密码本”映射的,现需要将"密文"解密并且输出 映射的规则(a-i)分别用(1-9)表示;(j-z")分别用(10-"26”)表示 约束:映射始终唯一 输入描述: “密文”字符串 输出描述: 明文字符串 补充说明: 翻译后的文本…...

因为manifest.json文件引起的 android-chrome-192x192.png 404 (Not Found)

H5项目打包之后&#xff0c;总是有这个报错&#xff0c;有时候还有别的icon也找不见 一通调查之后&#xff0c;发现是因为引入了一个vue插件 这个插件引入之后&#xff0c;webpack打包的时候就会自动在dist文件夹中产生一个manifest.json文件这个文件里面主要就是一些icon地址的…...

『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)

文章目录 &#x1f984; 进程替换&#x1f9a9; execl()函数&#x1f9a9; execlp()函数&#x1f9a9; execle()函数&#x1f9a9; execv()函数&#x1f9a9; execvp()函数&#x1f9a9; execvpe()函数&#x1f9a9; execve()函数 &#x1f984; 简单Shell命令行解释器的实现&a…...

【Linux】从零开始认识进程 — 前篇

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。。——山本耀司 从零开始认识进程 1 认识冯诺依曼体系2 操作系统3 进程3.1 什么是进程&#xff1f;&#xff1f;&#xff1f;3.2 进程管理PCB 3.3 Linux中的进程深入理解 3.4 进程创建总结 送给…...

公众号留言功能恢复了,你的开通了吗?

了解公众号的人都知道&#xff0c;腾讯在2018年3月宣布暂停新注册公众号的留言功能&#xff0c;这之后注册的公众号都不具备留言功能。 这成了很多号主运营人的一块心病&#xff0c;也包括我。 没有留言&#xff0c;就好似一个人玩单机游戏&#xff0c;无法与读者互动&#xff…...

C语言葵花宝典之——文件操作

前言&#xff1a; 在之前的学习中&#xff0c;我们所写的C语言程序总是在运行结束之后&#xff0c;就会自动销毁&#xff0c;那如果我们想将一个结果进行长期存储应该如何操作呢&#xff1f;这时候就需要我们用文件来操作。 目录 1、什么是文件&#xff1f; 1.1 程序文件 1.2…...

SSM框架,MyBatis-Plus的学习(下)

条件构造器 使用MyBatis-Plus的条件构造器&#xff0c;可以构建灵活高效的查询条件&#xff0c;可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xf…...

边缘计算网关的工作原理及其在工业领域的应用价值-天拓四方

随着物联网技术的快速发展&#xff0c;物联网时代已经悄然来临。在这个时代&#xff0c;数以亿计的设备相互连接&#xff0c;共享数据&#xff0c;共同构建智慧的世界。边缘计算网关通过将计算能力和数据存储推向网络的边缘&#xff0c;实现了对海量数据的实时处理&#xff0c;…...

下载指定版本的pytorch

下载网址&#xff1a;https://download.pytorch.org/whl/torch_stable.html 参考博客网址&#xff1a;https://blog.csdn.net/wusuoweiieq/article/details/132773977...

STL:List从0到1

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…...

利用高分五号02星高光谱数据进行地物识别

高分五号02星搭载了一台60公里幅宽、330谱段、30米分辨率的可见短波红外高光谱相机&#xff08;AHSI&#xff09;&#xff0c;可见近红外&#xff08;400~1000nm&#xff09;和短波红外光谱&#xff08;1000~2500nm&#xff09;分辨率分别达到5纳米和10纳米。单看参数性能优越&…...

前端如何识别上传的二维码---jsQR

npm npm i -d jsqrhtml <el-button click"$refs.input.click()">识别</el-button> <input type"file" style"display: none" id"input" input"upload">js import jsQR from "jsqr";decodeQR…...

flink1.18.0 自定义函数 接收row类型的参数

比如sql中某字段类型 array<row<f1 string,f2 string,f3 string,f4 bigint>> 现在需要编写 tableFunction 需要接受的参数如上 解决方案 用户定义函数|阿帕奇弗林克 --- User-defined Functions | Apache Flink...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...