基础算法(二)#蓝桥杯

文章目录

    • 8、双指针
      • 8.1、挑选子串
      • 8.2、聪明的小羊肖恩
      • 8.3、神奇的数组
    • 9、二分
      • 9.1、跳石头
      • 9.2、可凑成的最大花朵数
      • 9.3、最大通过数
      • 9.4、妮妮的月饼广场
      • 9.5、基德的神秘冒险
      • 9.6、体育健将
    • 10、倍增
      • 10.1、快速幂
      • 10.2、最近公共祖先LCA查询
      • 10.3、理想之城
      • 10.4、数的变换

8、双指针

8.1、挑选子串

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
int a[2001];
int main(){	IOS;int n,m,k;cin>>n>>m>>k;for(int i=1;i<=n;i++)cin>>a[i];ll ans=0;//快慢指针for(int i=1,j=0,cnt=0;i<=n;i++){//i>j 说明区间不合法,j+1 表示向右移还有空间,cnt<k 表示不满足>=kwhile(i>j||(j+1<=n&&cnt<k)){cnt+=(a[++j]>=m);}if(cnt>=k){//满足条件的情况下,找到这个最小区间[i,j],有n-j+1个子串ans+=n-j+1;}//a[i]>=m的话,就重新向后找到满足的cntcnt-=(a[i]>=m);}cout<<ans<<"\n";return 0;
}

8.2、聪明的小羊肖恩

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
ll l,r;
//bool isT(ll xx){
//	return (xx>=l)&&(xx<=r);
//}
int main(){	IOS;// l <= ai + aj <= r// l - ai <= aj <= r - aill n;cin>>n>>l>>r;vector<ll> a(n);for(auto &x:a)cin>>x;sort(a.begin(),a.end());ll ans=0;
//	超时
//	for(int i=0;i<n;i++){
//		for(int j=i+1;j<n;j++)
//			ans+=isT(a[i]+a[j]);
//	}//很多时候双指针问题,都可以使用二分替代for(int i=0;i<n;i++){ll L = ll(lower_bound(a.begin()+i+1,a.end(),l-a[i])-a.begin());ll R = ll(upper_bound(a.begin()+i+1,a.end(),r-a[i])-a.begin()-1);if(L<=R){ans+=R-L+1;}}cout<<ans<<"\n";return 0;
}

8.3、神奇的数组

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;// 这里的 xor, and, or 都是位运算
// 1 xor 0 = 1, 1 xor 1 = 0
// 异或可以理解成不进位加法
// 区间和,区间异或和,要想到前缀和,虽然这题不太能这么做,但也得想到这一点
// x + y >= x xor y
// 如果 x + y = x xor y,意味着加法不能进位,x and y = 0
// 因为 x and y = 0,所以 x xor y 一定会多一些 1int main(){	IOS;int n;cin>>n;vector<ll> a(n),zero(n+1);for(auto &x:a)cin>>x;for(int i=n-1;i>=0;i--){if(a[i]==0)zero[i]=zero[i+1]+1;}ll ans=0;for(int l=0;l<n;l++){int r=l;int sum_xor=0;while(r<n){if(a[r]==0){r=r+zero[r];}else{if(sum_xor & a[r])break;sum_xor^=a[r];r++;}}ans+=r-l;}cout<<ans<<'\n';return 0;
}

9、二分

二分的思想是什么呢?

是不是我们可以这样想,如果我们有答案了,那么肯定是符合题意的,所以说我们可以枚举所有可能正确的答案。

9.1、跳石头

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
const int N = 1e6+5;
int l,n,m;
ll a[N];
int check(int mid){int res=0;//可以看作移动的岩石数量for(int l=1,lst=0;l<=n;l++){if(a[l]-a[lst]<mid){res++;continue;}lst=l;}if(l-a[lst]<mid)return res+1;//最后一块return res;
}
int main(){	IOS;cin>>l>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];ll L = 0,R = 1e9+5;while(L+1!=R){ll mid=(L+R)/2;if(check(mid)<=m)L=mid;else R = mid;}cout<<L<<'\n';return 0;
}

9.2、可凑成的最大花朵数

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
int main(){	IOS;int n,k;cin>>n>>k;vector<ll> a(n);for(auto &x:a)cin>>x;ll l=0,r=2e13+5;while(l+1!=r){ll mid=(l+r)>>1;ll cnt=0;for(const auto& x:a)cnt+=min(mid,ll(x));if(cnt/k>=mid)l=mid;else r=mid;}cout<<l<<'\n';return 0;
}

9.3、最大通过数

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
int main(){	IOS;int n,m,k;cin>>n>>m>>k;vector<ll> a(n),b(m);for(auto &x:a)cin>>x;for(auto &x:b)cin>>x;ll r=0;while(r<n){if(k-a[r]>=0){k-=a[r];r++;}else break;}ll ans=r;for(int l=0;l<m;l++){k-=b[l];while(r>=1&&k<0){k+=a[r-1];r--;}// k 表示的是剩余的能量,当 k 小于零时,意味着无法完成接下来的任务// 因此,当 k 小于零时,就没有必要继续循环了,可以直接跳出循环if(k<0)break;ans=max(ans,r+l+1);}cout<<ans<<'\n';return 0;
}

9.4、妮妮的月饼广场

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
int main(){	IOS;int n,k;cin>>n>>k;vector<ll> a(n);for(auto &x:a)cin>>x;ll l=0,r=1e14+5;while(l+1!=r){ll mid=(l+r)>>1;ll cnt=0;for(const auto& x:a)cnt+=x/mid;//mid当作高度(我们去找这个最高的高度mid)//那么cnt即为数量if(cnt>=k)l=mid;else r=mid;}if(l<=0)cout<<"-1"<<'\n';else cout<<l<<'\n';return 0;
}

9.5、基德的神秘冒险

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
int main(){	IOS;ll n,q;cin>>n>>q;vector<ll> a(n);for(auto &x:a)cin>>x;sort(a.begin(),a.end());vector<ll> pre_sum(n+1,0);for(int i=1;i<=n;i++){pre_sum[i]=pre_sum[i-1]+((n-i)*(n-i-1))/2;//排列组合,每次都选择当前是最小的数,然后从后面取两个,所以是从n-i个里选两个}while(q--){ll k;cin>>k;cout<<a[lower_bound(pre_sum.begin(),pre_sum.end(),k)-pre_sum.begin()-1]<<'\n';}return 0;
}

9.6、体育健将

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
ll n,k;
bool cmp(const pair<ll,ll> &a,const pair<ll,ll> &b){return a.first+a.second<b.first+b.second;
}
int main(){	IOS;cin>>n>>k;vector<pair<ll,ll>> a(n);for(int i=0;i<n;i++)cin>>a[i].first;for(int i=0;i<n;i++)cin>>a[i].second;sort(a.begin(),a.end(),cmp);vector<ll> mn(n+1,1e9);mn[n]=1e9;for(int i=n-1;i>=0;i--)mn[i]=min(mn[i+1],a[i].first);for(int i=0;i<n;i++){if(k<mn[i]){// mn数组已经算是从小到大的数据了cout<<i<<'\n';return 0;}k-=(a[i].first+a[i].second);	}cout<<n<<'\n';return 0;
}

10、倍增

10.1、快速幂

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using ll = long long;
ll ksm(ll b,ll p,ll k){ll r=1;while(p!=0){if(p&1){r=(r*b)%k;}b=(b*b)%k;p>>=1;}return r;
}
int main(){IOS;ll b,p,k;cin>>b>>p>>k;cout<<ksm(b,p,k)<<'\n';return 0;
}

10.2、最近公共祖先LCA查询

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
using ll = long long;
int main() {IOS;int n;cin>>n;vector<vector<int>> graph(n+1);for(int i=1;i<n;i++){//n-1 条边int u,v;cin>>u>>v;graph[v].push_back(u);graph[u].push_back(v);//邻接矩阵}//倍增数组vector<array<int,21>> fa(n+1);//array<int,21> 固定的数组大小21vector<int> dep(n+1);//深度function<void(int,int)> dfs = [&](int x,int f){fa[x][0]=f;for(int i=1;i<=20;i++){fa[x][i]=fa[fa[x][i-1]][i-1];}//遍历数组for(const auto& tox:graph[x]){if(tox==f)continue;dep[tox]=dep[x]+1;dfs(tox,x);}};dfs(1,0);auto glca = [&](int x,int y){if(dep[x]<dep[y])swap(x,y);int d=dep[x]-dep[y];for(int i=20;i>=0;i--){if(d>>i & 1)x=fa[x][i];}if(x==y)return x;for(int i=20;i>=0;i--){if(fa[x][i] != fa[y][i]){x=fa[x][i];y=fa[y][i];}}return fa[x][0];};int q;cin>>q;while(q--){int x,y;cin>>x>>y;cout<<glca(x,y)<<'\n';}return 0;
}

10.3、理想之城

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using ll = long long;
int main(){ll n,k;cin>>n>>k;vector<int> a(n + 1);for(int i=1;i<=n;i++)cin>>a[i];auto jump = [&](int x,int p){for(int i=0;i<p;i++){x=a[x];}return x;};vector<int> fa(n+1);int now=1,i=1;while(1){//!=0 说明已经经过这个传送门,就造成了一个闭环,咱们只需要找到这个环的长度,让k对它求模if(fa[now]!=0){int len=i-fa[now];int p=int(k%len);//now:当前位置;步长:pcout<<jump(now,p)<<'\n';return 0;}else{fa[now]=i;//记录cur传送门的下标now=a[now];//更新now的值}if(i==k){cout<<now<<'\n';return 0;}i++;k--;//传送的次数}return 0;
}

10.4、数的变换

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using ll = long long;
const int inf = 2000001;
int main() {IOS; ll a,b,c,q;cin>>a>>b>>c>>q;// a = a/b + cif(b==1){cout<<a+ll(c*q)<<'\n';return 0;}ll ans=0;vector<array<int,31>> fa(inf+1);for(int i=0;i<=inf;i++){fa[i][0]=i/b+c;}	for(int j=1;j<=30;j++){for(int i=0;i<=inf;i++){if(fa[i][j-1]>inf)fa[i][j]=inf;//防止数组越界	//将当前位置的值,设置为2^j步后的位置的值else fa[i][j]=fa[fa[i][j-1]][j-1];}}ans = a;for(int i=30;i>=0;i--){if(q>>i&1){ans=fa[ans][i];}}cout<<ans<<'\n';return 0;
}

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

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

相关文章

【十二】【SQL】表的约束

NOT NULL非空约束 展示对NULL的查询 mysql> select NULL; ------ | NULL | ------ | NULL | ------ 1 row in set (0.00 sec)mysql> select 1NULL; -------- | 1NULL | -------- | NULL | -------- 1 row in set (0.00 sec)mysql> 第一条查询&#xff1a;select NU…

JasperStudio中TextField文本框组件渲染之后,出现行间距不一致的问题

目录 1.1、问题描述 1.2、解决方案 1.1、问题描述 最近在处理线上遇到的一个问题,是有关JasperReports报表相关的问题,问题背景大概是这样的:我们的项目中使用了JasperReports来渲染报表,其中使用到了Text Field文本框组件,但是问题是渲染出来的数据直接会出现一些间距…

Python脚本删除文本文件中的重复行

实例&#xff1a;需要用Python删除文本文件a.txt中的重复行. Case1:仅需要删除文件中的重复行&#xff1a; rFile open(a.txt, r) wFile open(b.txt, w) allLine rFile.readlines() rFile.close() s set() for i in allLine:s.add(i) for i in s:wFile.write(i) open(b.t…

洛谷:P3068 [USACO13JAN] Party Invitations S(枚举、前缀和)

这题我们数据范围太大&#xff0c;用二维肯定是不行的&#xff0c;我们可以采用一维线性存储。 如题意&#xff0c;我们可以将每组奶牛编号都存在一维数组里面&#xff0c;只需记录每组的头尾指针就可以了。 如题中样例我们就可以存储成1 3 3 4 1 2 3 4 5 6 7 4 3 2 1 然后第…

[LeetBook]【学习日记】寻找和为指定数字的连续数字

题目 文件组合 待传输文件被切分成多个部分&#xff0c;按照原排列顺序&#xff0c;每部分文件编号均为一个 正整数&#xff08;至少含有两个文件&#xff09;。传输要求为&#xff1a;连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组…

【kubernetes】关于k8s集群的存储卷

目录 一、存储卷的分类 二、empty存储卷以及特点 三、hostpath存储卷以及特点 四、nfs存储卷以及特点 五、pvc存储卷 查看pv的定义 查看pvc的定义 实操&#xff1a;静态创建pv的方式 实现pvc存储卷 步骤一&#xff1a;先完成nfs的目录共享&#xff0c;需要准备不同的目…

C# 中 TryParse 将字符串转换为特定类型的方法

在 C# 中&#xff0c;TryParse 是一个用于将字符串转换为特定类型的方法。它用于尝试解析字符串并将其转换为指定类型的值&#xff0c;而不会引发异常。如果解析成功&#xff0c;它将返回 true 并将解析结果存储在输出参数中&#xff1b;如果解析失败&#xff0c;它将返回 fals…

redis10 应用问题(穿透、击穿、雪崩、分布式锁)

思维草图 缓存穿透 查询不存在的数据&#xff0c;穿透redis缓存&#xff0c;请求直接攻击后端db。 问题 当系统中引入redis缓存后&#xff0c;一个请求进来后&#xff0c;会先从redis缓存中查询&#xff0c;缓存有就直接返回&#xff08;相当于一道隔离闸&#xff0c;保护db…

vue设计原理-带你重走vue诞生路程

我们首先看下面这个小demo demo源码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conten…

JAVA如何利用接口实现多继承问题

hello&#xff0c;上文带大家学习了java中类的继承&#xff0c;我们可以创建一个父类&#xff0c;将类中的共性抽取出来&#xff0c;通过子类继承的方式来实现代码的复用。今天带大家学习不同类之间的另外几种关系&#xff0c;即多态抽象类和接口。 多态的概念 多态&#xff0c…

Vue 3的Composition API和vue2的不同之处

Vue 3的Composition API是Vue.js框架的一个重要更新&#xff0c;它提供了一种新的组件逻辑组织和复用方式。在Vue 2中&#xff0c;我们通常使用Options API&#xff08;data、methods、computed等&#xff09;来组织组件的逻辑&#xff0c;但这种组织方式在处理复杂组件时可能会…

实体店好做还是电商平台好做?哪个发展前景较高?

我是电商珠珠 大部分人面对新的一年都会比较迷茫&#xff0c;想要创业会自己增加收入&#xff0c;却在开店和线上做电商这两者之间犹豫不决。不知道哪个更加合适自己&#xff0c;换句话来说&#xff0c;就是不知道哪个赔付率低一点。 现在这个行情&#xff0c;按照网友的说法…

嵌入式学习记录——信号量

信号量的基本内容: 信号量是一种资源,可以被初始化、申请、释放、销毁 P操作:申请资源 V操作:释放资源 1.无名信号量&#xff1a; 1.sem_init int sem_init(sem_t *sem, int pshared, unsigned int value); 功能: 初始化信号量 参数: sem:信号量空间首地…

C++ string类详解及模拟实现

目录 【本节目标】 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 面试题(暂不做讲解) 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明&#xff08;注意下面我只讲解最常用的接口&#xff09; 3. string类的模拟实现 3.1string类常用…

SpringCloud知多少

引言&#xff1a; Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集 成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用 程序。 如何定义微服务&#x…

Express学习(一)

Express Express简介 什么是Express 官方给出的概念&#xff1a;Express是基于Node.js平台&#xff0c;快速、开放、极简的web开发框架。 通俗的理解&#xff1a;Express的作用和Node.js内置的http模块类似&#xff0c;是专门用来创建Web服务器的。进一步理解Express 不使用E…

【软件使用】Markdown编辑器第一次使用介绍

【软件使用】Markdown编辑器第一次使用介绍 markdown格式支持的软件有&#xff1a;VS Code 和 Typora&#xff0c;CSDN写网页博文也是用的.md&#xff0c;CSDN能支持导入的文件也是以.md格式结尾的文件名。 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markd…

C语言——结构体(位段)、联合体、枚举

hello&#xff0c;大家好&#xff01;我是柚子&#xff0c;今天给大家分享的内容是C语言中的自定义类型结构体、联合体以及枚举&#xff0c;有什么疑问或建议可以在评论区留言&#xff0c;会顺评论区回访哦~ 一、结构体 struct a.结构体声明 不同于数组的是&#xff0c;结构…

【CSP试题回顾】202212-2-训练计划

CSP-202212-2-训练计划 解题思路 输入和初始化&#xff1a; 首先&#xff0c;代码从输入中获取项目的截止日期和项目数量。然后&#xff0c;它初始化一个项目列表&#xff0c;每个项目都有其依赖项、被依赖的项目集合、完成时间、总完成时间&#xff08;包括依赖链&#xff09…

【JavaSE】面向对象——多态性

多态性 多态性的概念 所谓多态性&#xff0c;理解为一个事物的多种形态。具体点就是去完成某个动作时&#xff0c;不同的对象会产生不同的状态。 多态性的好处 多态在Java中指的是父类的引用指向子类的对象&#xff0c;或者可以说是子类的对象赋给父类的引用。这样在我们的…