wordpress 仿站,最新的网站建设软件,洛阳网站建设内容,wordpress群发CSDN编程题-每日一练#xff08;2023-08-25#xff09; 一、题目名称#xff1a;影分身二、题目名称#xff1a;小鱼的航程(改进版)三、题目名称#xff1a;排查网络故障 一、题目名称#xff1a;影分身 时间限制#xff1a;1000ms内存限制#xff1a;256M 题目描述2023-08-25 一、题目名称影分身二、题目名称小鱼的航程(改进版)三、题目名称排查网络故障 一、题目名称影分身 时间限制1000ms内存限制256M 题目描述 已知字符串str。字符串str包含字符’x’,’y’。 如果相邻的两个字符不同消除两个字符,优先从左边进行消除。 xyyx - yx - 输入描述 输入多个字符。(1len1e5) 输出描述 输出最后的分身 示例 ✔️ 示例1: 输入 xyyyy 输出 yyy 解题思路 根据题目描述我们需要对输入的字符串进行处理消除相邻的不同字符。优先从左边开始消除。可以使用栈Stack数据结构来实现。 代码1如下
s input().strip() # 输入字符串##函数 calc 接受一个字符串参数 s返回一个字符串作为最后的分身
def calc(s: str) - str:stack [] # 初始化一个空栈 stack用于存储字符for ch in s: # 遍历输入的字符串s依次处理每个字符if not stack or ch stack[-1]: # 栈为空(not stack)或者当前字符 ch 与栈顶字符相同 (ch stack[-1])##将当前字符 ch 入栈 (stack.append(ch))stack.append(ch)else: ## 如果栈不为空并且当前字符 ch 与栈顶字符不同说明找到了一对相邻不同的字符将栈顶字符出栈 (stack.pop())stack.pop()##遍历完整个字符串后栈中剩余的字符即为最后的分身
##使用 join 函数将栈中的字符按照出栈顺序组合起来返回结果return .join(stack) result calc(s) # 消除相邻的不同字符
print(result) # 输出最后的分身代码2如下
#include iostream
#include stack
#include string##定义一个名为 calc的函数接受一个常量引用字符串作为参数并返回一个字符串。
std::string calc(const std::string s) {std::stackchar stack; #声明一个字符栈 stack用于模拟栈结构#使用 for 循环遍历输入字符串 s依次处理每个字符for (char ch : s) {##对于每个字符 ch 进行判断
##1、如果栈为空stack.empty()或者当前字符 ch 与栈顶字符相同ch stack.top()将当前字符 ch 入栈stack.push(ch)。
##2、如果栈不为空并且当前字符 ch 与栈顶字符不同说明找到了一对相邻不同的字符将栈顶元素出栈stack.pop()if (stack.empty() || ch stack.top()) {stack.push(ch);} else {stack.pop();}}##使用 for 循环遍历输入字符串 s 中的每个字符 ch。对于每个字符如果栈为空或者当前字符与栈顶字符相同将当前字符入栈否则说明找到了一对相邻不同的字符将栈顶元素出栈std::string result; #创建一个空字符串 result用于保存最后的分身while (!stack.empty()) { ##使用 while 循环将栈中的字符依次出栈并将出栈的字符加到 result 的前面result stack.top() result;stack.pop();}##最后返回保存最后的分身的字符串 resultreturn result;
}int main() {##声明一个字符串 s用于存储输入的字符串std::string s;##使用 std::getline 函数从标准输入中获取一行字符串std::getline(std::cin, s);##调用 calc函数处理输入字符串得到最后的分身将其赋给字符串变量 resultstd::string result calc(s);##使用 std::cout 将结果输出到标准输出流并在末尾添加换行符std::cout result std::endl;##程序正常结束return 0;
} 二、题目名称小鱼的航程(改进版) 时间限制1000ms内存限制256M 题目描述: 有一只小鱼它上午游泳150公里下午游泳100公里晚上和周末都休息实行双休日)假设从周x(1x7)开始算起请问这样过了n天以后小鱼一共累计游泳了多少公里呢 输入描述 输入两个整数x,n(表示从周x算起经过n天n在long int范围内。 输出描述 输出一个整数表示小鱼累计游泳了多少公里。 示例 ✔️示例1 输入 3 10 输出 2000 解题思路 根据输入的起始天数x和总天数n计算一定天数内包括起始天数游泳的总公里数。 代码1如下
# 读取输入,起始天数x和经过的天数n
x, n map(int, input().split())def solution(x, n):#计算出从起始天数开始经过n天后的总天数total_days total_days n x - 1total_days n x - 1#计算完整周期一周的游泳公里数total_kmtotal_km total_days // 7 * 250 * 5##计算额外的天数excess_days 即不足一周的天数excess_days total_days % 7##循环遍历range(excess_days)来判断每一天是否是工作日小于5如果是则将游泳公里数增加250米for i in range(excess_days):if i 5:total_km 250
##循环遍历从周一到前一天range(1, x)的天数在工作日小于6中减去250米的游泳公里数for i in range(1, x):if i 6:total_km - 250###计算得到的游泳公里数total_km作为函数的返回值return total_km###调用solution(x, n)
total_kmsolution(x, n)
print(total_km)代码2如下
#include stdio.h
#include stdlib.h#define MAX_SIZE 100## 注意n在long int范围内
long int solution(long int x, long int n) {long int total_days n x - 1;long int total_km total_days / 7 * 250 * 5;long int excess_days total_days % 7;for (long int i 0; i excess_days; i) {if (i 5) {total_km 250;}}for (long int i 1; i x; i) {if (i 6) {total_km - 250;}}return total_km;
}int main() {long int x, n;scanf(%ld %ld, x, n);long int total_km solution(x, n);printf(%ld\n, total_km);return 0;
} 三、题目名称排查网络故障 时间限制1000ms内存限制256M 题目描述: A地跟B地的网络中间有n个节点不包括A地和B地相邻的两个节点是通过网线连接。正常的情况下A地和B地是可以连通的有一天A地和B地突然不连通了已知只有一段网线出问题两个相邻的节点小明需要排查哪段网线出问题。他的排查步骤是 1。 选择某个中间节点 2。 在这个节点上判断跟A地B地是否连通用来判断那一边出问题 请问小明最少要排查多少次才能保证一定可以找到故障网线。 输入描述 一个正整数 n (n 10^18)表示A地和B地之间的节点数。 输出描述 输出一个数字代表保证一定可以找到故障网线的前提下小明最少要排查多少次 示例 ✔️示例1 输入 2 输出 2 解题思路 假设节点数为n我们可以将整个网络划分为两半即左边的节点和右边的节点。如果某个节点被选为判断节点那么它所在的位置就决定了是哪一半出了问题。 对于一个给定的节点数n首先找到最接近n的2的幂次方m使得m n。然后排查的次数就是最接近n的2的幂次方的对数log2(m)。 首先观察题目中的连接方式可以发现节点数n与排查次数node_number之间存在一定的关系。 1、假设排查次数为x那么排查的节点个数应为2^x - 1。 2、当排查的节点个数超过了n时即2^x - 1 n说明排查次数为x-1时已经可以确定故障网线的位置。 3、根据以上思路可以用循环不断将n除以2直到n小于等于0为止每次循环时check_number 加1。 4、最后输出check_number 即为所求的最少排查次数。 代码1如下*
##A地和B地之间的节点数n
n int(input())
##计数器check_number , 排查次数
check_number 0
##当n大于0时执行循环体
while n 0:
##将n除以2结果赋值给n相当于将节点数减半直到n小于等于0为止n n // 2
###每次循环时将check_number 加1check_number 1
###输出check_number即为所求的最少排查次数
print(check_number)代码2如下* 解题思路 首先我们需要找到一个节点通过判断这个节点是否与A地和B地连通来确定故障网线是在节点的哪一边。 假设A地和B地之间有n个节点我们可以将节点数n表示成二进制形式。例如n2时二进制为10表示有两个节点。 我们观察一下当节点数为2的幂次方时排查次数最少。例如n2时只有节点2需要排查n4时只有节点4需要排查n8时只有节点8需要排查以此类推。 因此我们可以先找到节点数n的二进制表示中最高位的1的位置记为highest_bit_pos。然后我们构造一个掩码mask将最高位1右边的所有位都置为1。再将节点数n与掩码mask进行或运算得到masked_n。 最后我们统计masked_n中1的个数即为小明最少要排查的次数。 n int(input())# 1、找到最高位1的位置即二进制字符串的长度减去3
### 如 bin(2)的结果是字符串0b10。长度为4这表示二进制数2的二进制表示形式为10。前缀0b表示这是一个二进制数最高位为1
highest_bit_pos len(bin(n)) - 3# 2、将最高位1右边的所有位都置为1
##使用左移运算符将1左移highest_bit_pos个位数然后减去1生成一个二进制数其中最高位1的右边都是1其余位为0。这个二进制数被赋值给变量mask
mask (1 highest_bit_pos) - 1##3、按位或运算符|将n与mask进行按位或操作
###将masked_n的最高位1右边的所有位都置为1而其余位与n保持相同
masked_n n | mask# 4、计算1的个数
##将masked_n转换为二进制字符串然后使用count()函数计算其中字符1的个数
count bin(masked_n).count(1)#5、输出count即masked_n中1的个数
print(count) 示例输入解释 例如当输入为2时输出为2。解释 1、节点数n为2二进制表示为10。 2、找到最高位1的位置为1即highest_bit_pos1。 3、构造掩码mask将最高位1右边的所有位都置为1即mask1。 4、将节点数n与掩码mask进行或运算得到masked_n3。 5、统计masked_n中1的个数即为小明最少要排查的次数即count2。