题解|2023暑期杭电多校02

news2024/9/24 17:18:28

【原文链接】
(补发)题解|2023暑期杭电多校02

1002.Binary Number

字符串、贪心

题目大意

给定一段长度为 n n n的01串,首位保证为1
任选定其中任意长的一段并将其反转
必须执行以上操作 k k k次,求操作后得到的01串表示的二进制数最大的状态并输出

解题思路

首先考虑次数不足的情况。对于一个二进制数,高位的权重大于其所有低位权重之和。因此优先考虑将靠前的字符中的0反转为1。

接下来比较多次反转不同方案的优劣。忽略操作次数限制,考虑这个字符串:1001001001

  1. 最直观的办法是直接选定第2-3,5-6,8-9位反转为1,得到全1串。
  2. 还有一种可选的优质方法:1001001001 ⇒ \Rightarrow 1110110111 ⇒ \Rightarrow 11100111 ⇒ \Rightarrow 1111111111

上述两种方法对于同样3段的0,次数相同,并且第一种方法更便于考虑,故采取第一种策略,从左往右反转0。

接下来再考虑已经转化为全1串,次数溢出的情况。可以考虑在转换过程中做无效操作浪费次数,避免对最大结果造成影响。

  1. 对于起始01串,如果有0必有前导1(首位保证为1)。因此可以在反转某段0时带上前导1一起,再消耗1次操作单独转回前导1,可以浪费1次数
  2. 对于单个1做2次反转操作,可以浪费2次数
  3. 对于连续的2个1,分两次单独反转这两个1,然后一起翻回,可以浪费3次数

在以上策略的搭配下,正常情况下可以消耗任意溢出次数,并最终状态为全1

最后考虑特殊情况

  1. 当起始01串全为1,且 k = 1 k=1 k=1,此时只能反转末位1使损失最小
  2. 当01串长度为1,此时起始01串只能是"1",其状态只由 k k k的奇偶决定

(P.S.)谁赛时程序中把’='写成"=="又不想Remake于是卡签一个半小时我不说

时间复杂度

O ( n ) O(n) O(n)

参考程序

int solve()
{
    string s,re;
    ll n,k;
    cin >> n >> k;
    cin >> s;
    s.push_back(0);
    ll flag=0,all1=1;
    FORLL(i,0,n-1){
        if(s[i]=='0'){
            if(flag==0&&k) {k--;flag=1;}
            if(flag) re.push_back('1');
            else re.push_back('0');
            all1=0;
        }
        else{
            re.push_back('1');
            flag=0;
        }
    }
    if(k==1&&all1) re[n-1]='0';
    if((k%2)&&n==1) re[0]='0';
    cout << re << endl;
    return 0;
}

1004.Card Game

思维题

题目大意

游戏规则和汉诺塔类似
n n n 根柱子,起始在第1根柱子上从下到上摆放着编号 k , k − 1 , ⋯   , 2 , 1 k,k-1,\cdots,2,1 k,k1,,2,1 的卡牌
规定:每根柱子只能从下到上放编号连续且递减的卡牌
每次操作可以将一根柱子上的最顶端的卡牌移动到其他柱子上(且不能违反规定)
求对于给定的柱子根数 n n n ,可以实现将第一根柱子上所有牌移动到第二根柱子上的最大卡牌张数 k k k

解题思路

这道题可以采用逆向思维。
起始态和最终态同构,拆解和合并过程对称,考虑从中间关键步骤分解顺推:

  1. 将最大点数的卡牌从 柱子 1 1 1 转移到 柱子 2 2 2
  2. 此时有 1 1 1 个空位,可以将牌数为 2 2 2 的柱子(假设他们恰好是次大的)拆分合并到柱子 2 2 2 ,并产生一个新的空位……
  3. 每次完全合并一个柱子,就会多一个空位,空位多的状态包含了空位少的状态。考虑状态转移关系:
    1. 记:利用 x x x 个空位可以转移到目标柱子的最大牌数为 f ( x ) f(x) f(x)
      显然: f ( 0 ) = 1 f(0)=1 f(0)=1
    2. 假设目前有个 x x x 空位,对于本轮要转移的柱子,可以先借用一个空位存储上半部分较小卡牌。存储数量为 f ( x − 1 ) f(x-1) f(x1) ,因为存储本身需要占用一个空位
    3. 利用剩余 x − 1 x-1 x1 个空位,最多可以转移并合并 f ( x − 1 ) f(x-1) f(x1) 张卡牌到柱子 2 2 2
    4. 再利用剩余 x − 1 x-1 x1 个空位,将存储的 f ( x − 1 ) f(x-1) f(x1) 张卡牌到柱子 2 2 2
    5. 综3.1-3.4,可以得到 f ( x ) f(x) f(x) 的递推式: f ( x ) = 2 f ( x − 1 ) f(x)=2f(x-1) f(x)=2f(x1)
      并求得 f ( x ) = 2 n f(x)=2^n f(x)=2n
  4. 第一步可以看作:利用 0 0 0 个空位,将最大点数的卡牌从 柱子 1 1 1 转移到 柱子 2 2 2
    最后一步可以看作:利用 n − 2 n-2 n2 个空位,将最后一堆卡牌从转移到 柱子 2 2 2
    中途每一步产生 1 1 1 个空位
    由此得到结果:

k = ∑ i = 0 n − 2 f ( i ) = 1 + 2 + ⋯ + 2 n − 2 = 2 n − 1 − 1 \begin{align} k &=\sum\limits_{i=0}^{n-2} f(i) \newline &=1+2+\cdots+2^{n-2} \newline &=2^{n-1}-1 \end{align} k=i=0n2f(i)=1+2++2n2=2n11

快速幂斩了

参考程序

int solve()
{
    ll n;
    cin >> n;
    cout << Get_Mod(qcpow(2,n-1)-1) << endl;
    //快速幂代码略
    return 0;
}


1007.foreverlasting and fried-chicken

图论、枚举

题目大意

给定一个无权无向图 G = ( V , E ) , ∣ V ∣ = n , ∣ E ∣ = m G=(V,E),|V|=n,|E|=m G=(V,E),V=n,E=m
求图中包含以下子图的数量:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解题思路

对于这个子图,有一个度为4的点和一个度为6的点,他们有4个公共邻居。借助这个特征,在给定无向图中找点

构图,在过程中记录每个点的度数 d e g i deg_i degi

对于每个 d e g 1 ≥ 6 deg_1\ge6 deg16 的点 v 1 v_1 v1 ,枚举 d e g 2 ≥ 4 deg_2\ge4 deg24 的点 v 2 v_2 v2
计算公共邻居个数,记为 n b r nbr nbr
对于 v 1 , v 2 v_1,v_2 v1,v2 ,其含有上述子图个数为: C n b r 4 ⋅ C d e g 1 − 4 2 C_{nbr}^4 \cdot C_{deg_1-4}^2 Cnbr4Cdeg142
(注意:如果 v 1 , v 2 v_1,v_2 v1,v2 相连,这条边是不允许被构入子图的,计算的度是要减去1)

计算每一对 v 1 , v 2 v_1,v_2 v1,v2 的个数之和即可

时间复杂度

朴素的做法的时间复杂度是 O ( n 3 ) O(n^3) O(n3) (会有人T到飞起)
考虑用bitset对图进行状态压缩,降低求 n b r nbr nbr 的时间复杂度
最终时间复杂度为 O ( n 3 ω ) O(\dfrac{n^3}{\omega}) O(ωn3)

参考程序

ll C[1005][1005]={0};
//在主函数中预处理组合数C,代码略
int solve()
{
    ll n,m;
    cin >> n >> m;
    bitset<1005> G[1005];
    int deg[1005]={0};
    ll u,v;
    FORLL(i,1,m){
        cin >> u >> v;
        G[u].set(v);
        G[v].set(u);
        deg[u]++;deg[v]++;
    }
    ll re=0,nbr,deg1,deg2;
    FORLL(i,1,n) if(deg[i]>=4){
        FORLL(j,i+1,n) if(j-i&&deg[j]>=4){
            deg1=deg[i]-G[i][j];
            deg2=deg[j]-G[i][j];
            //如果vi,vj直接相连,这条边是不能构入的
            nbr=(G[i]&G[j]).count();
            if(nbr>=4){
                if(deg1>=6) re=add(re,mul(C[nbr][4],C[deg1-4][2]));
                if(deg2>=6) re=add(re,mul(C[nbr][4],C[deg2-4][2]));
            }
        }
    }

    cout << re << endl;
    return 0;
}

1009.String Problem

字符串、签到

题目大意

给定一个字符串 S S S,仅包含小写字母
在其中选择 S S S k k k 个回文非空子串,且它们成对不相交,可以得到等同于 所选子串的长度之和减去子串数量 的分数: ∑ i = 1 k l e n ( s i ) − k \sum\limits_{i=1}^k len(s_i) -k i=1klen(si)k
为了让这道题成为签到题《增加题目难度》,所选子串最多包含一个字符,求对于给定字符串,可以获得的最高分数

解题思路

在增加难度后,很难想到所选的每一子串就是连续相同字符
答案即给定字符串长度减去连续相同字符段数

参考程序

int solve()
{
    string s;
    cin >> s;
    ll len=s.size();
    ll cnt=1;
    FORLL(i,1,len-1){
        if(s[i]!=s[i-1]) {cnt++;}
    }
    cout << len-cnt << endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA.2.运算符

目录 1.算术运算符 小数有可能会不精确&#xff0c;整数除以整数得整数 例子 package demo1;public class Hello {public static void main(String[] args) {System.out.println(12);System.out.println(1-2);System.out.println(5/2);System.out.println(5.0/2);System.out.…

代码随想录移除元素二刷

代码随想录移除元素二刷 leetcode 27 这道题思路的话可以这样去理解&#xff0c;用两个指针&#xff0c;一个慢指针&#xff0c;一个快指针。先让快指针往前面去探路&#xff0c;也就是去遍历数组&#xff0c;遇到不为val的值再去把该值赋值给nums[slow]&#xff0c;slow指针1…

3.1、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来&#xff0c;从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数&#xff08;如焦距、主点、畸变等&#xff09;和外部参数&#xff08;如相机位置、朝向等&#xff09…

uni-app 影视类小程序开发从零到一 | 开源项目分享

引言 在数字娱乐时代&#xff0c;移动设备已成为我们生活中不可或缺的一部分&#xff0c;尤其是对于电影爱好者而言&#xff0c;随时随地享受精彩影片成为一种日常需求。爱影家&#xff0c;一款基于 uni-app 开发的影视类小程序&#xff0c;正是为此而生。它不仅提供了丰富的影…

北京交通大学《深度学习》专业课,实验3卷积、空洞卷积、残差神经网络实验

一、实验要求 1. 二维卷积实验&#xff08;平台课与专业课要求相同&#xff09; ⚫ 手写二维卷积的实现&#xff0c;并在至少一个数据集上进行实验&#xff0c;从训练时间、预测精 度、Loss变化等角度分析实验结果&#xff08;最好使用图表展示&#xff09; ⚫ 使用torch.nn…

基于ffmepg的视频剪辑

1.ffmpeg命令实现视频剪辑 FFmpeg是一个非常强大的视频处理工具&#xff0c;可以用来剪辑视频。以下是一个基本的FFmpeg命令行示例&#xff0c;用于剪辑视频&#xff1a; $ ffmpeg -i ./最后一滴水.mp4 -ss 0:0:20 -t 50 -c copy output.mp4-i ./最后一滴水.mp4 输入文件  …

利用PyTorch进行模型量化

利用PyTorch进行模型量化 目录 利用PyTorch进行模型量化 一、模型量化概述 1.为什么需要模型量化&#xff1f; 2.模型量化的挑战 二、使用PyTorch进行模型量化 1.PyTorch的量化优势 2.准备工作 3.选择要量化的模型 4.量化前的准备工作 三、PyTorch的量化工具包 1.介…

Linux复习02

一、什么是操作系统 操作系统是一款做软硬件管理的软件&#xff01; 一个好的操作系统&#xff0c;衡量的指标是&#xff1a;稳定、快、安全 操作系统的核心工作&#xff1a; 通过对下管理好软硬件资源的手段&#xff0c;达到对上提供良好的&#xff08;稳定&#xff0c;快…

【MindSpore学习打卡】应用实践-LLM原理和实践-文本解码原理 —— 以MindNLP为例

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本生成是一项重要且具有挑战性的任务。从对话系统到自动文本补全&#xff0c;文本生成技术无处不在。本文将深入探讨自回归语言模型的文本解码原理&#xff0c;使用MindNLP工具进行示例演示&#xff0c;并详细分析…

240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1]

240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1] 在做语义分割二分类任务时&#xff0c;有时下载到的数据集或者我们自己制作的数据集&#xff0c;标签像素值会是[0,255]&#xff08;或者含有一些杂乱像素&#xff09;&#xff0c;但在该类任务中&#xff0c;往往0代表…

androidkiller重编译apk失败的问题

androidkiller重编译apk失败 参考&#xff1a; https://blog.csdn.net/qq_38393271/article/details/127057187 https://blog.csdn.net/hkz0704/article/details/132855098 已解决&#xff1a;“apktool” W: invalid resource directory name:XXX\res navigation 关键是编译…

脑肿瘤有哪些分类? 哪些人会得脑肿瘤?

脑肿瘤&#xff0c;作为一类严重的脑部疾病&#xff0c;其分类复杂多样&#xff0c;主要分为原发性脑肿瘤和脑转移瘤两大类。原发性脑肿瘤起源于颅内组织&#xff0c;常见的有胶质瘤、脑膜瘤、生殖细胞瘤、颅内表皮样囊肿及鞍区肿瘤等。其中&#xff0c;胶质瘤作为最常见的脑神…

# Redis 入门到精通(九)-- 主从复制

Redis 入门到精通&#xff08;九&#xff09;-- 主从复制&#xff08;1&#xff09; 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用&#xff1f; 1&#xff09;单机 redis 的风险与问题 问题1.机器故障  现…

WeTest 海外本地化测试的全生命周期服务 第一期

伴随全球化和数字化的加速推进&#xff0c;越来越多的国内企业希望将其产品服务推向国际&#xff0c;以便在全球数字市场中占有一席之地。除去传统的欧美市场&#xff0c;国内企业也积极开拓东南亚、南亚、拉美、中东和非洲等新兴市场。这些地区的互联网普及率和数字化需求正在…

vue+watermark-dom实现页面水印效果

前言 页面水印大家应该都不陌生&#xff0c;它可以用于验证数字媒体的来源和完整性&#xff0c;还可以用于版权保护和信息识别&#xff0c;这些信息可以在不影响媒体质量的情况下嵌入&#xff0c;‌并在需要时进行提取。‌本文将通过 vue 结合 watermark-dom 库&#xff0c;教大…

《AIGC 实战宝典》(2024版) 正式发布!

2024 新年伊始&#xff0c;OpenAI 推出文生视频 Sora&#xff0c;风靡整个科技圈。 最近又发布了 ChatGPT-4o&#xff0c;这是一个全新模型&#xff0c;不仅能处理文本&#xff0c;还能实时理解和生成音频和图像。OpenAI 用实际行动给全世界的科技公司又上了一课。 如何从0到1…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…

offer题目51:数组中的逆序对

题目描述&#xff1a;在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。例如&#xff0c;在数组{7,5,6,4}中&#xff0c;一共存在5个逆序对&#xff0c;分别是(7…

[Vulnhub] TORMENT IRC+FTP+CUPS+SMTP+apache配置文件权限提升+pkexec权限提升

信息收集 IP AddressOpening Ports192.168.101.152TCP:21,22,25,80,111,139,143,445,631 $ nmap -p- 192.168.101.152 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login a…

新建一个git仓库并且把已有项目推送到git远程仓库

总贴 1. 创建一个空项目&#xff0c;不会看新建仓库 2. 克隆这个项目到某个文件夹去&#xff0c;比如我想克隆到我的E盘的code下面 3. 我的这个文件夹下面是有东西的&#xff0c;一点都不影响 . 4. 用命令行进入这个文件夹 命令行已经显示了已经在E盘下面code文件夹, 不会…