(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(9)

news2024/12/24 10:03:53

1002 shortest path

 

记忆化搜索可以用 map 实现,频繁读取而不考虑元素顺序的可以使用 unordered_map ,有效降低时间空间复杂度

dfs(n/2)+n%2+1,其中n%2表示将n变为偶数的次数,1表示操作n/2,dfs(n/2)即表示将n/2变为1的次数

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
unordered_map<ll,int>mp;
ll dfs(ll n){
    if(n==0) return 0;
    if(n==1) return 0;//从1变为1次数为0
    if(mp.count(n)) return mp[n];
    return mp[n]=min(dfs(n/2)+n%2+1,dfs(n/3)+n%3+1);
 //当n为2时,会出现dfs(0),所以dfs(0)要有返回值,否则就死循环了
 //而且当n为2时,n/2合法,但n/3不合法,所以我们要使得dfs(0)的返回值保证取min时取dfs(n/2)+n%2+1而非dfs(n/3)+n%3+1
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        cout<<dfs(n)<<endl;
    }    
    return 0;
}

或者我们可以先预处理一些f(n),n从1到1e6,当n在这个范围内时,可以直接返回答案

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1e6;
int f[N];
unordered_map<ll,int>mp;
ll dfs(ll n){
    if(n<N) return f[n]; 
    if(mp.count(n)) return mp[n];
    return mp[n]=min(dfs(n/2)+n%2+1,dfs(n/3)+n%3+1);
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    memset(f,0x3f,sizeof f);
    f[1]=0;//1变为1的次数为0
    for(int i=1;i<N;i++){
        if(i*2<N) f[i*2]=min(f[i*2],f[i]+1);//f[i*2]可以由f[i]转移过来,操作次数+1,操作为*2
        if(i*3<N) f[i*3]=min(f[i*3],f[i]+1);//f[i*3]可以由f[i]转移过来,操作次数+1,操作为*3
        if(i+1<N) f[i+1]=min(f[i+1],f[i]+1);//f[i+1]可以由f[i]转移过来,操作次数+1,操作为+1
    }
    int t=1;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        cout<<dfs(n)<<endl;
    }    
    return 0;
}

1005 List Reshape

模拟题

注意cin,cout取消缓冲区同步,不能与getchar()同时用

法一:一个字符一个字符输出,当必要时添加'['或者']'

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<vector>
#include<cstdio>
#define endl '\n'
using namespace std;
typedef long long ll;
string s;
int x,y;
void solve() {
    getchar();
    getline(cin,s);
    cin>>x>>y;
    int len=s.size();
    int cnt=0;
    int cnt1=0;
    for(int i=0;i<len;i++){
        if(i==1) cout<<'[';
        cout<<s[i];
        if(s[i+1]==','||s[i+1]==']') cnt++;
        else if(s[i]==' ') cnt1++;
        if(cnt==y) {
            cout<<']';
            cnt=0;
        }
        else if(cnt1==y) {
            cout<<'[';
            cnt1=0;
        }
    }
    cout<<endl;
}
int main() {
//    ios::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

法二:搞一个string类型字符,存储完整的一段字符串,然后放在[]中 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<vector>
#include<cstdio>
#define endl '\n'
using namespace std;
typedef long long ll;
string s;
string ss;
int x,y;
void solve() {
    getchar();
    getline(cin,s);
    cin>>x>>y;
    int len=s.size();
    cout<<'[';
    int cnt=0;
    for(int i=1;i<len-1;i++){
        char ch=s[i];
        ss+=ch;
        if(s[i+1]==','||s[i+1]==']') cnt++;
        if(cnt==y){
            cout<<'['<<ss<<']';
            cnt=0;
            if(i<len-2) cout<<", ";
            i+=2;
            ss="";
        }
    }
    cout<<']';
    cout<<endl;
}
int main() {
//    ios::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

1008 Coins

期望是每次可能结果的概率乘以其结果的总和,可以理解为加权平均,和平均数作对比,n个数的平均数是每个数乘以1/n,然后全部加起来,而加权平均每个数乘以的概率不一样,然后全部加起来

我们先算两个人的数学期望,比如说两个人的硬币数分别为m,n,那么f(m,n)=1+0.5*f(m+1,n-1)+0.5*f(m-1,n+1)

可以这么理解,假设只能是n给m一个硬币,那么f(m,n)=1+1*f(m+1,n-1)

f(m,n)表示第一个有m个硬币,第二个人有n个硬币的回合数,等于下一轮游戏的回合数加1,即1*f(m+1,n-1)+1

只不过算期望回合数需要乘以概率,f(m,n)=1+1*f(m+1,n-1)改成了f(m,n)=1+0.5*f(m+1,n-1)+0.5*f(m-1,n+1)

 

打表找规律

打表代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
double dfs(ll m,ll n,ll depth){
    if(depth==40) return 0;//递归到10层已经很小很小了,接近于0了
    if(m==0||n==0) return 0;
    return 1+dfs(m+1,n-1,depth+1)/2+dfs(m-1,n+1,depth+1)/2;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--){
        ll n,m;
        cin>>n>>m;
        cout<<dfs(n,m,0)<<endl;
    }    
    return 0;
}

 

 

 

 

 

发现f(m,n)=m*n

根据样例

猜测三个人期望回合数为a1*a2+a2*a3+a1*a3

同理,拓展到n个人的情况

由于数据太大,所以用__int128,我们得自己写一个输出函数,否则输出不了__int128类型

a1*a2+a1*a3+...a1*an+a2*a3+...a2*an+a3*a4+...a3*an+...an-1*an=a1*(a2+a3+...an)+a2*(a3+...an)+a3*(a4+...an)+an-1*an

我们可以算出全部的和sum,然后每次求前缀和,用sum减去前缀和就是标蓝的部分

char类型和int类型相加会自动转化为int类型,char类型会先变为它的ascii值,再相加

 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1e5+10;
int a[N];
int n;
inline void print(__int128 x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
void solve() {
    cin>>n;
    __int128 sum=0;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
        sum+=a[i];
    }
    __int128 ans=0;
    __int128 x=0;
    for(int i=1; i<=n; i++) {
        x+=a[i];
        ans+=a[i]*(sum-x);
    }
    print(ans);
    cout<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

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

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

相关文章

深入探索Spring后置处理器:解析作用与实际应用场景

前言 BeanDefinitionRegistryPostProcessor &#xff0c; BeanFactoryPostProcessor &#xff0c;InstantiationAwareBeanPostProcessor&#xff0c; BeanPostProcessor是spring生命周期中常见的4个后置处理器&#xff0c;但是对于其作用和执行顺序很多人还不是非常清楚&#…

软件测试的调用接口怎么调用,逻辑是什么?

一、什么是接口测试&#xff1f; 接口测试是测试系统组件之间接口的测试。接口主要用于检测外部系统和内部子系统之间的交互点。测试的重点是检查数据交换、传输、控制和管理过程&#xff0c;以及系统之间的相互逻辑依赖。 二、为什么要做接口测试&#xff1f; 在淘宝系统的…

Java8新特性---Stream流

什么是Stream 是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。集合讲究的是数据&#xff0c;流讲的是计算 注意&#xff1a; Stream不会自己存储元素Stream不会改变源对象&#xff0c;相反&#xff0c;他们会返回持有结果的新…

GPT-4耗尽全宇宙数据!OpenAI接连吃官司,竟因数据太缺了,UC伯克利教授发出警告

穷尽「全网」&#xff0c;生成式AI很快无数据可用。 近日&#xff0c;著名UC伯克利计算机科学家Stuart Russell称&#xff0c;ChatGPT和其他AI工具的训练可能很快耗尽「全宇宙的文本」。 换句话说&#xff0c;训练像ChatGPT这样的AI&#xff0c;将因数据量不够而受阻。 这可能…

五、修改官方FreeRTOS例程(STM32F1)

1、官方源码下载 (1)进入FreeRTOS官网&#xff1a;FreeRTOS官网 (2)下载FreeRTOS。(选择带示例的下载) 2、删减目录 (1)下载后解压的FreeRTOS文件如下图所示。 (2)删除下图中红框勾选的文件。 FreeRTOS-Plus&#xff0c;FreeRTOS的生态文件&#xff0c;非必需的。tools&…

esp8266+电压检测模块检测电池电压

该模块5v时输出1v&#xff0c;因esp8266 ADC引脚(A0)支持电压范围是0v-1v&#xff0c;所以该方案仅支持0-5v电压检测 接线&#xff1a; - 接 esp8266GND 可不接 S 接 ADC esp8266 为 A0 VCC 被检测直流电 GND 被检测直流电- #include <Wire.h>const int adcPin A0; // …

Redis五大基本数据类型及其使用场景

文章目录 **一 什么是NoSQL&#xff1f;****二 redis是什么&#xff1f;****三 redis五大基本类型**1 String&#xff08;字符串&#xff09;**应用场景** 2 List&#xff08;列表&#xff09;**应用场景** 3 Set&#xff08;集合&#xff09;4 sorted set&#xff08;有序集合…

excel逻辑函数篇1

1、AND(logical1,[logical2],…)&#xff1a;用于测试所有条件是否均为TRUE 检查所有参数均为true&#xff0c;如果是则返回true 2、OR(logical1,[logical2],…)&#xff1a;用于测试是否有为TRUE的条件 如果任意参数值为true&#xff0c;即返回true&#xff1b;只有当所有参数…

223、仿真-基于51单片机温湿度PH值二氧化碳(C02)报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&…

机器学习笔记 - 基于keras + 小型Xception网络进行图像分类

一、简述 Xception 是深度为 71 层的卷积神经网络,仅依赖于深度可分离的卷积层。 论文中将卷积神经网络中的 Inception 模块解释为常规卷积和深度可分离卷积运算(深度卷积后跟点卷积)之间的中间步骤。从这个角度来看,深度可分离卷积可以理解为具有最大数量塔的 Inception 模…

学习笔记230804---restful风格的接口,delete的传参方式问题

如果后端提供的删除接口是restful风格&#xff0c;那么使用地址栏拼接的方式发送请求&#xff0c;数据放在主体中&#xff0c;后端接受不到&#xff0c;当然也还有一种可能&#xff0c;后端在这个接口的接参设置上是req.query接参。 问题描述 今天遇到的问题是&#xff0c;de…

windows子系统wsl2备份(迁移D盘)还原系统

windows子系统wsl2备份还原系统 1.查看wsl版本 wsl -l -v2.停止wsl子系统 wsl --terminate Ubuntu-22.043.导出子系统备份 wsl --export Ubuntu-22.04 D:\Ubuntu_bak.tar4.删除原有系统 wsl --unregister Ubuntu-22.045.还原系统 wsl --import Ubuntu-22.04 d:\Ubuntu-ws…

Jenkins-发送邮件配置

在Jenkins构建执行完毕后&#xff0c;需要及时通知相关人员。因此在jenkins中是可以通过邮件通知的。 一、Jenkins自带的邮件通知功能 找到manage Jenkins->Configure System&#xff0c;进行邮件配置&#xff1a; 2. 配置Jenkins自带的邮箱信息 完成上面的配置后&#xf…

【0基础入门Python笔记】三、python 之函数以及常用内置函数

三、python 之函数以及常用内置函数 函数函数定义函数调用函数参数返回值 常用内置函数input()函数range()函数其它 函数 函数是一种用于封装可重复使用代码块的工具&#xff0c;能够将一系列操作组织成一个逻辑单元。 函数定义 在Python中&#xff0c;函数通过def关键字进行…

Python可视化在量化交易中的应用(12)_Seaborn柱状图

Seaborn中柱状图的绘制方法 seaborn中绘制折线图使用的是sns.barplot()函数&#xff1a; sns.barplot(x,y,hue,data,order,hue_order,estimator,ci95,n_boot1000,units,seed,orient,color,palette,saturation0.75,errcolor‘.26’,errwidth,capsize,dodgeTrue,ax,**kwargs,) …

linux RabbitMQ-3.8.5 安装

软件版本操作系统CentOS Linux release 7.9.2009erlangerlang-23.0.2-1.el7.x86_64rabbitMQrabbitmq-server-3.8.5-1.el7 RabbitMQ的安装首先需要安装Erlang,因为它是基于Erlang的VM运行的。 RabbitMQ安装需要依赖:socat和logrotate&#xff0c;logrotate操作系统已经存在了&…

内网穿透技术之神卓互联如何检测本地环境

在使用神卓互联Windows版客户端的过程中添加和编辑映射通道默认会自动生效&#xff0c;如您遇到无法访问的情况&#xff0c;可通过客户端上的检测工具进行环境检测。 Windows客户端检测本地环境&#xff0c;登录神卓互联客户端&#xff0c;在主界面下方的按钮组里选择【环境检…

《Python入门到精通》os模块详解,Python os标准库

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 os模块详解 1、文件目录操作os.stat() 获取文件状态os.utime() 修改文件时间os.r…

PostgreSQL父子建表查询所有的子数据-利用自定义函数查询

pgsql 函数查询代码 select find_space_tree_list_by_nodeid(1,1) 查询结果示意图 获取子集函数代码 CREATE OR REPLACE FUNCTION "public"."find_space_tree_list_by_nodeid"("nodeid" varchar, "viewid" varchar)RETURNS "…

8.19论文阅读

文章目录 Graph-Segmenter: Graph Transformer with Boundary-aware Attention for Semantic Segmentation方法 SCSC: Spatial Cross-scale Convolution Module to Strengthen both CNNs and Transformers方法 Deformable Mixer Transformer with Gating for Multi-Task Learni…