【题解】2023牛客寒假算法基础集训营4

news2024/10/10 0:22:24

目录

  • A 清楚姐姐学信息论
    • 思路
  • B. 清楚姐姐学构造
    • 思路
  • C. 清楚姐姐学01背包(Easy Version)
    • 思路
  • D. 清楚姐姐学01背包(Hard Version)
    • 思路
  • E. 清楚姐姐打怪升级
    • 思路
  • F. 清楚姐姐学树状数组
    • 思路
  • G. 清楚姐姐逛街(Easy Version)
    • 思路
  • L. 清楚姐姐的三角形I
    • 思路
  • M. 清楚姐姐的三角形II
    • 思路

A 清楚姐姐学信息论

思路

tag:签到
进制是效率最高的进制,越靠近e进制效率越高。
证明如下:
在这里插入图片描述

如果有一个nr进制数,则表示这个数一共需要n*r张牌
(成本),一共可以表示r^n个数(回报),那么关于成本的式子
即:r*log(r,m)
m是常量,对r/lnr求导,发现其在x=e为极值点,则直接输出。

int x,y;
void solve()
{
    cin>>x>>y;
    if(x>y)swap(x,y);
    if(x==2&&y==3)cout<<3<<endl;
    else cout<<min(x,y)<<endl;
}

B. 清楚姐姐学构造

思路

tag 数学,构造
构造 a i = a j a_i=a_j ai=aj b i = − b j b_i=-b_j bi=bj
由题可知 a i + b i ≡ c i a_i+b_i\equiv c_i ai+bici a j + b j ≡ c j a_j+b_j\equiv c_j aj+bjcj
2 a i ≡ c i + c j 2a_i\equiv c_i+c_j 2aici+cj
分情况讨论:

  1. 如果 c i + c j c_i+c_j ci+cj为偶数,则直接赋值 a i = ( c i + c j ) / 2 a_i=(c_i+c_j)/2 ai=(ci+cj)/2
  2. 如果 c i + c j c_i+c_j ci+cj为奇数,如果 m ! = 2 m != 2 m!=2则赋值 a i = ( c i + c j + m ) / 2 a_i=(c_i+c_j+m)/2 ai=(ci+cj+m)/2。否则NO
const int N=1e5+10,mod=1e9+7;
int c[N];
int a[N],b[N];
int n,m;
void solve()
{
    cin>>n>>m;
    rep(i,0,n-1)cin>>c[i];
    rep(i,0,n-1)
    {
        int t=n-i-1;
        int x=(c[i]+c[t])%m;
        if(x%2==0)x/=2;
        else
        {
            if(m==2)
            {
                NO;
                return;
            }
            x=(x+m)/2;
        }
        a[i]=x,a[t]=x;
        b[i]=((c[i]-a[i])%m+m)%m;
        b[t]=((c[t]-a[t])%m+m)%m;
    }
    YES;
    for(int i=0;i<n;i++)cout<<a[i]<<' ';
    cout<<endl;
    for(int i=0;i<n;i++)cout<<b[i]<<' ';
}

C. 清楚姐姐学01背包(Easy Version)

思路

tag: 01背包,简单题
问每个物品价值增加多少可以保证出现在01背包中。
所以我们先算出不要物品i时,的最大价值,然后用maxv+1-当前价值就是最后结果

const int N=110;
int w[N],v[N];
int n,m;
int f[N];
int a[N];
void solve()
{
    cin>>n>>m;
    rep(i,1,n)cin>>v[i]>>w[i];
    rep(i,1,n)
        dwn(j,m,v[i])
            f[j]=max(f[j],f[j-v[i]]+w[i]);
    int maxv=f[m];
    rep(k,1,n)
    {
        rep(i,1,m)f[i]=0;
        rep(i,1,n)
        {
            if(i==k)continue;
            dwn(j,m,v[i])
                f[j]=max(f[j],f[j-v[i]]+w[i]);
        }
        if(maxv>f[m])a[k]=0;
        else a[k]=maxv+1-f[m-v[k]]-w[k];
    }
    rep(i,1,n)cout<<a[i]<<endl;
}

D. 清楚姐姐学01背包(Hard Version)

思路

tag 01背包前后缀优化
没有办法进行O(n^3),所以我们想办法将其进行优化。
f1[i][j]存背包内存放前i个物品,背包容量是j的最优解
f2[i][j]存背包内存放后i个物品,背包容量是j的最优解
思路是:必不选的最大价值-必选的价值+1


const int N=5010;
int w[N],v[N];
int f1[N][N],f2[N][N];
int a[N];
int n,m;
void solve()
{
	cin>>n>>m;
	rep(i,1,n)cin>>v[i]>>w[i];
	rep(i,1,n)
	{
		rep(j,0,v[i]-1)f1[i][j]=f1[i-1][j];
		rep(j,v[i],m)f1[i][j]=max(f1[i-1][j],f1[i-1][j-v[i]]+w[i]);
	}
	dwn(i,n,1)
	{
		rep(j,0,v[i]-1)f2[i][j]=f2[i+1][j];
		rep(j,v[i],m)f2[i][j]=max(f2[i+1][j],f2[i+1][j-v[i]]+w[i]);
	}
	rep(i,1,n)
	{
		int res=0;
		rep(j,0,m-v[i])//必选i 
			res=max(res,f1[i-1][j]+f2[i+1][m-v[i]-j]);
		res+=w[i];
		int sum=0;
		rep(j,0,m)//必不选i 
			sum=max(sum,f1[i-1][j]+f2[i+1][m-j]);
		a[i]=max(0ll,sum-res+1);
	}
	rep(i,1,n)cout<<a[i]<<endl;
	cout<<endl;
}
signed main()
{
	io;
    int _;_=1;
    //cin>>_;
    while(_--)solve();
}

E. 清楚姐姐打怪升级

思路

tag: 数学(二分)
枚举攻击次数。推数学公式即可

const int N=1e5+10;
int n,t,a;
int h[N],v[N];
void solve()
{
    cin>>n>>t>>a;
    rep(i,1,n)
        cin>>h[i]>>v[i];
    int res=0;
    rep(i,1,n)
    {
        if(h[i]<=a)
            res++;
        else
        {
            if(a<=v[i]*t)
            {
                cout<<-1<<endl;
                return;
            }
            int pre=h[i];
            h[i]-=a;
            res++;
            res+=(h[i]+a-t*v[i]-1)/(a-t*v[i]);
        }
    }
    cout<<1+(res-1)*t<<endl;
}

F. 清楚姐姐学树状数组

思路

tag: 树状数组,树的遍历

/*
    悲观看待成功,乐观看待失败。 
    author:leimingze 
*/

#include<bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
const double eps=1e-7;
const int base=131;
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
#define x first
#define y second
#define int long long
#define lb long double
#define pb push_back
#define endl '\n'//交互题删掉此 
#define all(v) (v).begin(),(v).end()
#define PII pair<int,int>
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dwn(i,n,x) for(int i=n;i>=x;i--)
#define ll_INF 0x7f7f7f7f7f7f7f7f
#define INF 0x3f3f3f3f
#define io ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
int Mod(int a,int mod){return (a%mod+mod)%mod;}
int lowbit(int x){return x&-x;}//最低位1及其后面的0构成的数值
int qmi(int a, int k, int p){int res = 1 % p;while (k){if (k & 1) res = Mod(res * a , p);a = Mod(a * a , p);k >>= 1;}return res;}
int inv(int a,int mod){return qmi(a,mod-2,mod);}
int lcm(int a,int b){return a*b/__gcd(a,b);}
int n,k,q;
int l,m,r;
int sz(int x)//包括x在内的x子树的节点个数 
{
	return (lowbit(x)<<1)-1;
} 
bool is_left_child(int x)//判断x是否为其父节点的左孩子,lowbit(x)的前一位是0则是 
{
	return !(x&(lowbit(x)<<1));
}
int fa(int x)//求父亲节点 
{
	return is_left_child(x)?x+lowbit(x):x-lowbit(x);//如果是左孩子则其父节点是x-lowbit(x),否则x+lowbit(x) 
} 
int lch(int x)//求左孩子,把x的最低位1置0,把x的最低位1的下一位置为1 得到 左孩子 
{
	return x^lowbit(x)^(lowbit(x)>>1);
} 
int rch(int x)
{
	return x^(lowbit(x)>>1);//把x的最低位1的下一位置为1 得到右孩子 	
} 
int VLR(int x)
{
	int rt=n;
	int pos=1;
	while(rt!=x)
	{
		pos++;
		if(x<rt)rt=lch(rt);
		else
		{
			pos+=sz(lch(rt));
			rt=rch(rt);
		}
	}
	return pos;
}
int LRD(int x)
{
	if(x==n)return n;
	int rt=x;
	int pos=sz(rt);
	while(rt!=n)
	{
		if(rt==rch(fa(rt)))pos+=sz(lch(fa(rt)));
		rt=fa(rt);
	}
	return pos;
}
void solve()
{
	cin>>k>>q;
	n=1ll<<k;
	while(q--)
	{
		int x;
		cin>>x;
		cout<<VLR(x)<<' '<<x<<' '<<LRD(x)<<endl;
	}
}
signed main()
{
	io;
    int _;_=1;
    //cin>>_;
    while(_--)solve();
}

G. 清楚姐姐逛街(Easy Version)

思路

tag:搜索,暴力
先预处理zngg到达每个点的时间,然后qcjj按照地标走

const int N=1010;
int n,m;
int startx,starty;
int q;
char g[N][N];
int dist[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
PII get(char c,int x,int y)
{
    if(c=='L')
        if(g[x][y-1]!='#')return {x,y-1};
    if(c=='R')
        if(g[x][y+1]!='#')return {x,y+1};
    if(c=='U')
        if(g[x-1][y]!='#')return {x-1,y};
    if(c=='D')
        if(g[x+1][y]!='#')return {x+1,y};
    return {x,y};
}
void bfs()
{
    queue<PII>q;
    q.push({startx,starty});
    dist[startx][starty]=0;
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int a=dx[i]+t.x,b=dy[i]+t.y;
            if(a<0||a>=n||b<0||b>=m)continue;
            if(g[a][b]=='#')continue;
            if(dist[a][b]!=0x3f3f3f3f)continue;
            dist[a][b]=dist[t.x][t.y]+1;
            q.push({a,b});
        }
    }
}
int find(int x,int y)
{
    int cnt=1;
    int res=ll_INF;
    while(cnt<=n*m)
    {
        auto t=get(g[x][y],x,y);
        int a=t.x,b=t.y;
        if(a==x&&b==y)
        {
            if(dist[a][b]==0x3f3f3f3f)
                return -1;
        }
        if(dist[a][b]<=cnt)res=min(res,max(dist[a][b],cnt));
        cnt++;
        x=a,y=b;
    }
    return res;
}
void solve()
{
    cin>>n>>m>>startx>>starty>>q;
    rep(i,0,n-1)
        rep(j,0,m-1)
            cin>>g[i][j],dist[i][j]=0x3f3f3f3f;
    bfs();
    while(q--)
    {
        int x,y;
        cin>>x>>y;
        cout<<find(x,y)<<endl;
    }
}

L. 清楚姐姐的三角形I

思路

tag:签到

int va,vb,vc;
void solve()
{
    cin>>va>>vb>>vc;
    int a=vb+vc-va;
    int b=va+vc-vb;
    int c=va+vb-vc;
    if(a%2||b%2||c%2)NO;
    else if(a+b>c&&a+c>b&&b+c>a&&abs(a-b)<c&&abs(a-c)<b&&abs(b-c)<a)
    {
        YES;
        cout<<a/2<<' '<<b/2<<' '<<c/2<<endl;
    }
    else NO;
}

M. 清楚姐姐的三角形II

思路

tag:诈骗,签到

const int N=1e5+10;
int a[N];
int n;
void solve()
{
    cin>>n;
    a[1]=a[2]=1;
    a[3]=2;
    for(int i=4;i<=n;i+=3)
    {
        a[i]=a[i-3];
        a[i+1]=a[i-2];
        a[i+2]=a[i-1];
    }
    rep(i,1,n)cout<<a[i]<<' ';
    cout<<endl;
}

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

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

相关文章

Grafana 系列文章(四):Grafana Explore

&#x1f449;️URL: https://grafana.com/docs/grafana/latest/explore/ &#x1f4dd;Description: Explore Grafana 的仪表盘 UI 是关于构建可视化的仪表盘。Explore 剥离了仪表盘和面板选项&#xff0c;这样你就可以。.. Grafana 的仪表盘 UI 是关于构建可视化的仪表盘的。…

happen-before

happen-before 什么是happen-before JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happens-before关系&#xff0c;尽管a操作和b操作在不同的线程中执行&#xff0c;但JMM向程序员保证a操作将对b操作可见). …

Leetcode(上)

Leetcode&#xff08;上&#xff09; 1.LeetCode01 两数之和 给定一个整数数组nums和一个整数目标值target&#xff0c;请你在该数组中找出和为目标值target的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

数据结构——优先级队列和堆

目录 一、堆 1.概念 2.堆的存储方式 3.性质 4.模拟实现堆&#xff08;以小根堆为例&#xff09; &#xff08;1&#xff09;.堆的调整 &#xff08;2&#xff09;.堆的创建 &#xff08;3&#xff09;.建堆的时间复杂度 &#xff08;4&#xff09;.堆的插入和删除 5.堆…

微服务篇之Eureka注册中心

目录 1. 初识Eureka 1.1 Eureka是什么 1.2 什么是注册中心 1.3 Eureka的原理 2. Eureka的快速入门 2.1 搭建eureka的单机服务 2.2 注册服务的消费者 2.3 注册服务的提供者 3. Eureka的特性 3.1 自我保护机制 3.2 集群支持AP特性 4. Eureka的集群 4.1 不分区集群模式 4.2 分…

Go语言测试(回归测试、集成测试、单元测试简述)与项目开发的流程简述

测试项目流程1. 测试的类别2. 单元测试的规则&#xff08;函数以Test开头&#xff09;2.1 示例12.2 示例23. Mock测试&#xff08;打桩&#xff09;4. 基准测试&#xff08;类似于单元测试&#xff0c;函数以Benchmark开头&#xff09;5. 项目开发的流程项目拆解代码设计测试运…

浪涌保护器(电涌保护器)连接线规格分析方案

低压配电设计中&#xff0c;现在对于浪涌保护器(SPD)及其专用保护装置的标注和画法&#xff0c;都比较规范统一了。那有没有遇到要求标注浪涌保护器连接线规格的情况&#xff1f;或者说&#xff0c;设计师有没有责任要标注清楚各类浪涌保护器连接线规格&#xff1f;地凯科技防雷…

屈光发育档案是什么?为什么专业医生建议从3岁开始就要建立?

当孩子出现近视问题时&#xff0c;家长们都会很焦虑。其实儿童视力发育是一个循序渐进&#xff0c;逐渐成长完善的过程。我们唯一能做的就是预防&#xff0c;在未近视时提前发现近视的趋势。来源&#xff1a;卫生健康委网站这其中最为关键的是建立屈光发育档案。国家青少年近视…

视频剪辑有这6个高清视频素材库就够了

视频剪辑必备的6个网站&#xff0c;免费、可商用&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材类型非常多&#xff0c;平面设计、UI设计、电商类、图片、视频、音频等素材站内都能找到。视频素材全部高清、无…

C++——map和set封装实现

目录 mao和set模拟实现 模拟实现 取K的仿函数 Insert 迭代器 begin和end 和-- operator[] 完整代码 set.h map.h rbtree.h mao和set模拟实现 STL map和set只是包含了几个头文件 主要在选中的这个文件里&#xff0c;打开之后我们可以看到红黑树 用红黑树…

【操作系统】第二章 进程与线程

文章目录第二章 知识体系2.1 进程与线程2.1.1 进程的概念和特征2.1.2 进程的状态与转换2.1.3 进程的组成2.1.4 进程控制2.1.5 进程通信2.1.6 进程的上下文切换2.1.7 线程和多线程模型2.2 处理机调度2.2.1 调度的概念2.2.2 调度的层次分类2.2.3 调度的实现2.2.4 典型的调度算法2…

【八大数据排序法】选择排序法的图形理解和案例实现 | C++

第十五章 选择排序法 目录 第十五章 选择排序法 ●前言 ●认识排序 ●一、选择排序法是什么&#xff1f; 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ● 总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法&#xff0c;它主要是将一堆不规则…

活体识别3:论文笔记之《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》

说明 本文是我对论文《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》做的一个简单笔记。 这个论文是芬兰奥卢大学(Oulu)课题组的一篇很有代表性的论文&#xff0c;写于2015年&#xff0c;使用的是“LBP特征SVM分类器”这种比较传统的方案&#xff0c;方案不复杂&…

如何使用 JuiceFS 创建 WebDAV 共享

WebDAV 是一种基于 HTTP 的文件共享协议&#xff0c;最初被设计用于多用户文档协作编辑的场景&#xff0c;也被广泛应用在基于互联网的文件存储、数据同步等网盘类应用场景。 手机端和 PC 端有大量的应用内置了对 WebDAV 的支持&#xff0c;比如知名的文献管理工具 Zotero、iP…

微信小程序 java Springboot校园租房指南房屋租赁系统

东前端&#xff1b;首页、房源信息、租房指南、我的&#xff0c;用户前端&#xff1b;首页、房源信息、租房指南、我的等主要功能模块的操作和管理。 1.出租房源信息的上传、审核、发布&#xff1b; 2.租房信息的浏览、查找、查看&#xff1b; 3.用户与出租方通信&#xff1b; …

Docker-01基本命令

1、Docker安装 系统镜像为Centos7.x yum包更新到最新 sudo yum update安装需要的软件包&#xff0c;yum-util提供yum-config-manager功能。另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-mapper-persistent-data lvm2设置yum源为阿里云 sudo yu…

OpenText 企业内容管理平台客户案例——印度鲁宾(Lupin)制药公司

OpenText 企业内容管理平台客户案例——印度鲁宾&#xff08;Lupin&#xff09;制药公司 公司&#xff1a;Lupin 行业&#xff1a;制药 方案&#xff1a; OpenText™ Extended ECM Platform OpenText™ AppWorks™ OpenText™ Capture 合作伙伴&#xff1a;Muraai Informat…

uniapp数据缓存与apk打包

目录 一、uniapp数据缓存Storage 1.1、存值uni.setStorageSync(KEY,DATA) 1.2、取值uni.getStorageSync(KEY) 1.3、uni.removeStorageSync(KEY) 1.4、uni.clearStorageSync() 二、配置发行H5--打包 一、uniapp数据缓存Storage 1.1、存值uni.setStorageSync(KEY,DATA) 含…

APISIX介绍和安装使用

APISIX目录什么是APISIX&#xff1f;与 Kong的比较概述安装1. 安装依赖2 安装 Apache APISIX2.1 安装脚本2.2 启动 APISIXAPISIX 控制台动态负载均衡1. 启动2个微服务命令2.验证服务是否正常3. 重要概念4.创建 APISIX Upstream&#xff08;上游&#xff0c;后端 API 服务&#…

Python(12)--元组

一、元组的基本介绍 元组&#xff08;tuple&#xff09;&#xff1a;这种数据类型结构与列表相同&#xff0c;但它与列表也有很大的差异&#xff0c;它的元素值与元素个数不可更改。 列表的定义是将元素放入[ ]中&#xff0c;元组的定义是将元素放入&#xff08;&#xff09;中…