HBCPC2022-河北省大学生程序设计竞赛

news2024/11/19 5:39:21

部分题解

  • 7-4 键盘故障
  • 7-6 筷子
  • 7-8 方
  • 7-9 优美的字符串

7-4 键盘故障

签到题,直接遍历字符串,相同则跳过,不相同则输出
题目链接:https://pintia.cn/problem-sets/1584003400735793152/exam/problems/1584003481883000835
AC代码:

#include<iostream>
using namespace std;
string sa;
int main()
{
    cin>>sa;
    char pre=' ';
    for(int i=0;i<sa.length();i++)
    {
        if(sa[i]!=pre)
        {
            cout<<sa[i];
            pre=sa[i];
        }
    }
    return 0;
}

7-6 筷子

贪心,需要冷静分析模拟

  1. 题目一个重要的点是,无论怎么取k只筷子都能凑成m双,对于取每一种筷子,无非就两种情况,取奇数个,或者取偶数个,最严苛的取筷子的方法就是每种都取奇数个,每种取奇数个都可以凑成m双,每种取比它小1只的偶数个也能凑成m双,就怕你取的全都是奇数个,每种都要多取一个出来
  2. 但是有个问题,最终每种都是奇数个,能凑成m双筷子,要保证取的筷子数最少,为啥不每种取比它小的偶数个呢,这样每种还能少取一只筷子,但是假如你少取2个,你能保证你是对不同种类的筷子分别少取一个吗,不能啊,你如果只在一种筷子里面取,那你的最终筷子的对数就比m少了,因此只能对其中一种筷子少取一个
    在这里插入图片描述
    感觉贪心就是一种启发式算法,想到位了,感觉对了,就成了
    注意:本题的输入输出数据很多,cin和cout很耗时,加上tie(0)仍然很费时间,所以需要换成scanf和printf
    AC代码:
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long LL;
LL t,n,m;
int main()
{
    scanf("%ld",&t);
    for(LL i=0;i<t;i++)
    {
        scanf("%ld %ld",&n,&m);
        LL dui=0,zhi=0,sheng=0;
        for(LL j=0;j<n;j++)
        {
            LL t;scanf("%ld",&t);
            if(t%2) //如果是奇数个就全取
            {
                zhi+=t;dui+=t/2;
            }
            else   //偶数个取小于等于该偶数的最大奇数个
            {
                zhi+=(t-1); dui+=(t-1)/2;
                sheng+=1;    //剩下的那一个备用
            }
        }
        
        if(dui>=m) //取多了,减少几对
        {
            zhi-=(dui-m)*2;
            zhi-=1;
        }
        else if(dui==m)   zhi-=1;  //全是奇数个可以,但是其中一种鞋子减少一个也可以
        else  //取得还不够,从剩下的里面去凑
        {
            if(sheng>=m-dui)  zhi+=(m-dui);  //剩下的足够
            else zhi=-1;   //剩下的凑不齐m对了
        }
        printf("%ld\n",zhi);
    }
    return 0;
}

官方题解思路:(贪心靠感觉,思路各有各的道理)
在这里插入图片描述

7-8 方

签到题,直接输出答案
题目链接:https://pintia.cn/problem-sets/1584003400735793152/exam/problems/1584003481883000839
AC代码:

#include<bits/stdc++.h>
using namespace std;
int t,n;
int main()
{
    cin>>t;
    for(int i=0;i<t;i++)
    {
        cin>>n;
        double tmp=pow(2,0.5);
        cout<<fixed<<setprecision(2)<<pow(tmp,n-1)<<endl;
    }
    return 0;
}

7-9 优美的字符串

  1. 简单的dp问题,但是dp问题难就难在需要自己能够识别出来是个dp问题,就需要多练题,这个题与之前的一个刷房子问题比较像
  2. 回文字符串:正向读字符串和反向读字符串是一样的
  3. 题目说不存在长度严格大于 2 的回文串,也就是说只能是a,aa这种,我们可以从根源上砍断长度大于2的回文串,也就是从长度为3的串下手,如果字符串中没有aaa、aba这种形式的回文串,就一定不存在长度严格大于2的回文串,因此我们每次只考虑最后三个字符串
  4. 定义dp数组和状态转移方程
    dp[i][0] 长度为i的字符串结尾为abc形式的方案数
    dp[i][1] 长度为i的字符串结尾为aab形式的方案数
    dp[i][2] 长度为i的字符串结尾为abb形式的方案数
    状态转移:
    dp[i][0] = dp[i-1][0] * (m-2) +dp[i-1][1] * (m-2)
    abc
    dp[i-1][0]: abc 往最后插入一个字符,形成的新字符串最后三个不相等,只需要插入字符不等于b和c ,可选m-2种字符
    dp[i-1][1]: aab 往最后插入一个字符,形成的新字符串最后三个不相等,只需要插入字符不等于a和b ,可选m-2种字符
    dp[i-1][2]: abb b和b相等,往最后插入一个字符,形成的新字符串最后三个不可能不相等,无法转移
    dp[i][1] = dp[i-1][2]*(m-2)
    aab
    dp[i-1][0]:abc b和c不相等,往最后插入一个字符,形成的新字符串前两个字符不可能相等,无法转移
    dp[i-1][1]:aab 同上
    dp[i-1][2]:abb 往最后插入一个字符,形成的新字符串最后三个为bbc,只需要插入字符不等于a和b ,可选m-2种字符
    dp[i][2] = dp[i-1][0]+ dp[i-1][1]
    abb
    dp[i-1][0]:abc 往最后插入一个字符,形成的新字符串最后三个为bcc,插入字符必须为c
    dp[i-1][1]:aab 往最后插入一个字符,形成的新字符串最后三个为abb,插入字符必须为b
    dp[i-1][2]:abb b和b相等,往最后插入一个字符,形成的新字符串最后三个不可能为abb形式,无法转移
  5. 边界需要单独判断,dp数组从dp[3]开始计算,并且dp[3]是跟m有关的,需要进行一下推演,取余的问题就看当前相加或者相乘得到的数会不会超过p,会超过就需要取余
    AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,m;
const LL p= 1000000007;
const LL N=1000005;
LL dp[N][3];
int main()
{
    cin>>n>>m;
    if(n<=2)   //所有组合字符串都满足
    {
    	LL ans=pow(m,n);
        cout<<ans%p;
        return 0;
    }
    dp[3][0]=((m*(m-1))%p*(m-2))%p;   
    dp[3][1]=(m*(m-1))%p;
    dp[3][2]=(m*(m-1))%p;
    for(LL i=4;i<=n;i++)
    {
        dp[i][0] = ((dp[i-1][0]*(m-2))%p +(dp[i-1][1]*(m-2))%p)%p;
        dp[i][1]  = (dp[i-1][2]*(m-2))%p;
        dp[i][2]  = (dp[i-1][0]%p+ dp[i-1][1]%p)%p;
    }
    cout<<(dp[n][0]+dp[n][1]+dp[n][2])%p;
    return 0;
}

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

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

相关文章

业聚医疗在港交所上市:市值约76亿港元,钱永勋、刘桂祯夫妇控股

12月23日&#xff0c;业聚医疗集团控股有限公司&#xff08;下称“业聚医疗”&#xff0c;HK:06929&#xff09;在港交所上市。本次上市&#xff0c;业聚医疗的发行价为8.80港元/股&#xff0c;全球发行发售5463.30万股&#xff0c;募集资金总额约为4.81亿港元&#xff0c;募资…

java基于ssm,jsp鞋城源码卖鞋服装男鞋商城女鞋商城项目源码

ssm开发的网上鞋城系统&#xff0c;主要有商品分类&#xff0c;列表&#xff0c;详情&#xff0c;加入购物车&#xff0c;订单&#xff0c;收货地址等功能&#xff0c;单商家登录后台可以发布商品&#xff0c;上下架商品&#xff0c;发货退款等管理订单。 演示视频&#xff1a;…

【开源项目】历史数据迁移

历史数据迁移 项目地址&#xff1a;https://gitee.com/xl-echo/dataMigration 历史迁移解决方案。微服务的架构为基础&#xff0c;使用多种设计模式&#xff0c;如&#xff1a;单利、桥接、工厂、模板、策略等。其中涉及的核心技术有&#xff0c;多线程、过滤器等。致力于解决…

django 中间件基础介绍

1、简单的理解&#xff0c;1个中间件就是1个类&#xff0c;中间件一般可以用来检查用户是否登录。 2、用户通过浏览器访问视图函数的内容需要先通过中间件&#xff0c;通过中间件后再到视图函数&#xff0c;返回结果也需要通过中间件&#xff0c;如下草图 3、自定义一个中间件…

一文读懂Linux内核处理器架构中的栈

栈是什么&#xff1f;栈有什么作用&#xff1f; 首先&#xff0c;栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out)&#xff0c;数据只能在串列的一端 (称为&#xff1a;栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。根据…

基于CNN卷积神经网络 猫狗图像识别

目录 一&#xff1a;数据集准备 二&#xff1a;读取自己的数据集 三&#xff1a;搭建网络 训练模型 四&#xff1a;猫狗图像识别 一&#xff1a;数据集准备 从官网下载比较麻烦&#xff0c;可根据以下链接&#xff0c;从百度网盘获取数据集 https://pan.baidu.com/s/13hw4L…

【Docker系列】容器环境配置

个人名片&#xff1a; 对人间的热爱与歌颂&#xff0c;可抵岁月冗长&#x1f31e; Github&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff1a;念舒_C.ying CSDN主页✏️&#xff1a;念舒_C.ying 个人博客&#x1f30f; &#xff1a;念舒_C.ying Docker可以让开发者打包他们…

55.函数的参数传递

55.函数的参数传递 文章目录55.函数的参数传递1.函数的参数2.参数的传递方法3.使用位置参数传递参数4.使用关键字传递参数1.函数的参数 自定义函数有2种参数&#xff1a;形式参数和实际参数。 def语句中的参数不是实际参数&#xff0c;我们称之为形式参数&#xff0c;简称形参…

C51——添加震动开盖功能,使用外部中断优化

void main() {double dis;Timer1Init();Time0Init();SG90_Init();while(1){dis get_dis();if(dis<10 || SW1 0||Vibrate 0){OpenTheLed5();opengaizi(); // }else{CloseTheLed5();closegaizi();}} }像这样只是简单的通过震动模块传给单片机一个让舵机转动&#xff0c;出来…

lvm 制作

壹&#xff1a; 创建LVM 逻辑卷 1&#xff0c;将物理盘格式为pv卷&#xff08;物理卷&#xff09;&#xff0c;使用pvcreate 命令 pvcreate /dev/sdc 或则是 pvcreate /dev/sdc /dev/sdb pvdisplay 或pvs 命令查看 PV 物理卷得创建情况 2,创建卷组 VG 通过vgcreate 命令,将pv加…

《图解TCP/IP》阅读笔记(第六章 6.3、6.4)—— 鼎鼎大名的UDP、TCP

前言&#xff1a; 本篇将要介绍UDP和TCP&#xff0c;篇幅略长&#xff0c;主要是TCP的内容较为复杂 6.3 UDP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09; 根据此前的了解&#xff0c;UDP不提供复杂的控制机制&#xff0c;其是一种利用IP提…

JavaSE(类和对象、this用法、构造方法)

1. 面向对象 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 面向过程注重的是…

2005-2020年全国及31省绿色信贷水平原始数据及测算

2005-2020年各省绿色信贷水平原始数据及测算 1、时间&#xff1a;2005-2020年 2、来源&#xff1a;整理自统计NJ、工业NJ、2018年经济普查&#xff0c;其中2017年采用插值法填补 3、范围&#xff1a;包括全国及31省市 4、数据内容&#xff1a;包含计算过程和原始数据 5、具…

动态规划——线性dp

基于数字三角形问题扩展 参考闫氏dp分析法参考闫氏dp分析法参考闫氏dp分析法 方格取数 f[i1][j1][i2][j2]表示&#xff08;1,1&#xff09;到&#xff08;i1,j1&#xff09;和&#xff08;1,1&#xff09;到(i2,j2)和的最大值f[i1][j1][i2][j2]表示&#xff08;1,1&#xff09…

ubuntu小技巧29--frp实现通过公网访问内网服务

ubuntu小技巧29--frp实现通过公网访问内网服务1 介绍2 方法步骤3 注意事项4 说明1 介绍 很多时候我们需要在外部网络中访问局域网或者个人家庭主机&#xff0c;以便于实现一个机器在多个地方都能用&#xff0c;此时我们就可以使用 frp 或者其竞品来实现该功能。 frp 是一个专…

11Python面相对象基础语法

面相对象基础语法 01. dir 内置函数 在 Python 中 对象几乎是无所不在的&#xff0c;我们之前学习的 变量、数据、函数 都是对象 在 Python 中可以使用以下两个方法验证&#xff1a; 使用内置函数 dir 传入 标识符 / 数据&#xff0c;可以查看对象内的 所有属性及方法 提示…

基于 UWB 数字孪生钢厂人员安全定位

钢铁冶炼从原料采购、焦化烧结、炼铁、炼钢、轧钢、到产出成品&#xff0c;其冗长的生产工序、复杂的作业场景&#xff0c;更应加以重视生产现场的人员作业安全&#xff0c;将安全防范监管贯穿日常作业全过程&#xff0c;打通安全生产责任“最后一公里”。 随着近几年钢厂信息…

电源管理芯片|“小方寸”大作为—TMI3191直击智能穿戴电源痛点!

随着移动通信、人工智能等技术的不断发展和融合, 智能终端产业正在加速裂变&#xff0c;智能穿戴迅速成为人们日常生活和工作中的新宠。 根据IDC最新数据显示&#xff0c;2016年~2020年出货量从1.02亿台增长至4.45亿台&#xff0c;预测2020-2025年全球智能可穿戴设备出货量复合…

手写B+树

1.特点 https://blog.csdn.net/weixin_57128596/article/details/127030901?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167176442416800188598723%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id167176442416800…

springboot mybatis大学生校园宿舍管理系统源码含文档

摘 要&#xff1a;宿舍是大学生学习与生活的主要场所之一&#xff0c;宿舍管理是高校学工管理事务中 尤为重要的一项。随着我国高校招生规模的进一步扩大&#xff0c;学生总体人数的不断增加&#xff0c; 宿舍管理工作变得愈加沉重和琐碎&#xff0c;学生宿舍信息的采集、汇总…