蓝桥杯小白赛第一场(1~6)(期望DP)

1、模拟

2、贪心

3、前缀和

4、猜结论

5、双指针

6、期望DP

1. 蘑菇炸弹
 

        

思路:一个简单的暴力模拟。

        

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int n;
  cin >> n;
  vector<int>a(n , 0);
  for(int i = 0 ; i < n ; i ++)
    cin >> a[i];
  int cnt = 0;
  for(int i = 1 ; i < n - 1; i ++){
      if(a[i] >= a[i - 1] + a[i + 1])
        cnt++;
  }
  cout << cnt;
  return 0;
}

2. 构造数字

        

       思路:考虑正整数中每一位的贡献:可以发现位数越大的位置贡献越大,因此将M优先分配给高位即可。

        

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int n , m;
  cin >> n >> m;
  for(int i = 0 ; i < n ; i ++){
      int x = min(m , 9);
      cout << x;
      m -= x;
  }
  return 0;
}

3. 小蓝的金牌梦

思路: 首先考虑若已知长度为x,如何快速求出子数组最大值,可以用前缀和来O(1)的去解决,然后遍历所有的子数组左端点,时间复杂度总共O(N - X)。接下来考虑所有质数情况:

10^5范围内的质数共有9592个,考虑遍历所有情况:总共的复杂度为O(10^5 * 9592 - \sum prime)约为5e^8,直接暴力做还是能过的,所以直接暴力冲就行。

        

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
#define int long long
const LL maxn = 4e05+7;
const LL N = 5e05+10;
const LL mod = 1e09+7;
const int inf = 0x3f3f3f3f;
const LL llinf = 5e18;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >mi;//小根堆
priority_queue<LL> ma;//大根堆
LL gcd(LL a, LL b){
	return b > 0 ? gcd(b , a % b) : a;
}

LL lcm(LL a , LL b){
	return a / gcd(a , b) * b;
}
int n , m;
vector<int>a(N , 0);
void init(int n){
	for(int i = 0 ; i <= n ; i ++){
		a[i] = 0;
	}
}
vector<LL>prime;//存储素数
bool vis[N+5];
void su() 
{
	for(int i=2;i<=N;i++)
	{
		if(!vis[i])
		prime.pb(i);
		for(int j=0;j < prime.size() && prime[j] * i <= N;j ++)
		{
			vis[prime[j]*i]=1;
			if(i % prime[j]==0)
			break;
		}
	}
} 
void solve() 
{
	cin >> n;
	int sum[n + 5];
	sum[0] = 0;
	for(int i = 1 ; i <= n ; i ++)
		cin >> a[i] , sum[i] = sum[i - 1] + a[i];
	int maxx = -1e9;
	for(int i = 0 ; i < prime.size() ; i ++){
		int len = prime[i];
		if(len > n){
			break;
		}
		for(int j = len ; j <= n ; j ++){
			maxx = max(maxx , sum[j] - sum[j - len]);
		}
	}
	cout << maxx;
}            
signed main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout.precision(10);
    int t=1;
    su();
	//cin>>t;
    while(t--)
    {
    	solve();
    }
    return 0;
}

 4. 合并石子加强版

        

        思路:若只关注一个石头:发现最终他的贡献为其自身权值与其他所有石头权值乘积之和。而其他所有石头也是一样的。因此最终的代价和合并石子的顺序无关,只需要按顺序模拟即可。(longlong会爆,需要unsigned long long )

        

#include <iostream>
using namespace std;
#define int unsigned long long
signed main()
{
  int n;
  cin >> n;
  int a[n];
  for(int i = 0 ; i < n ; i ++)
    cin >> a[i];
  int sum = a[0];
  int tot = 0;
  for(int i = 1 ; i < n ; i ++){
    tot += a[i] * sum;
    sum += a[i];
  }
  cout << tot;
  return 0;
}

 5. 简单的LIS问题

       

思路:可以发现:修改一个数之后的效果最多能够使得LIS增加1。接下来考虑怎么添加能保证上升子序列增加1:

1、若当前上升子序列不包含最后一个元素,那么将最后一个元素设为10^{100}就一定能使得上升子序列加一。

2、若上升子序列的开头不为0且不为第一个数,那么将第一个数改为0就一定能使得上升子序列增加1。

3、修改子序列中相邻两个数a_{b_{i}} a_{b_{i + 1}}之间的某个数,使得a_{b_{i}} < a_x < a_{b_{i +1}}(b_{i} < x < b_{i + 1})

所以我们需要知道的是:以某个数开头往后所能形成的最长上升子序列以及以某个数结尾能够形成的最长上升子序列。分别设为l[i]以及r[i],对应了以a_{i}结尾能够形成最长上升子序列长度以及以a_{i}开头能够形成的最长上升子序列长度。

对于情况1和情况2,可以直接通过l,r函数来求解,对于情况3,可以想到将lr合并,即最长上升子序列长度为l[i] + r[j] (i <j \ and \ a[i] < a[j]),当j - i > 2 \ and \ a[j] - a[i] >= 2时,则能够在[i , j]之间修改一个数使得LIS增加1。

        

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;
int a[5001],l[5001],r[5001];
signed main()
{
	cin >> n;
	for(int i = 1 ; i <= n ; i ++)
		cin >> a[i];
	for(int i = 1 ; i <= n ; i ++){
		l[i] = r[i] = 1;
	}
	for(int i = 2 ; i <= n ; i ++){
		for(int j = 1 ; j < i ; j ++){
			if(a[i] > a[j])
				l[i] = max(l[i] , l[j] + 1);
		}
	}
	for(int i = n ; i >= 1 ; i --){
		for(int j = n ; j > i ; j --){
			if(a[i] < a[j])
				r[i] = max(r[i] , r[j] + 1);
		}
	}
	for (int i = 1;i <= n ; i ++)
	{
		if(i < n){//等效于将末尾设为10^1000
			ans = max(ans , l[i] + 1);
		}
		else{
			ans = max(ans , l[i]);
		}
		if(i != 1 && a[i] != 0){//等效于将 a1 设为0
			ans = max(ans , r[i] + 1);
		}
		else{
			ans = max(ans , r[i]);
		}
		for(int j = i + 2 ; j <= n ; j ++)//等效于将i ~ j 当中的一个数设为ai + 1
			if (a[j] - a[i] > 1)
				ans = max(ans , l[i] + r[j] + 1);
	}
	cout << ans;
}

6. 期望次数

思路:一道期望DP的板子题,定义DP[i]为当前x = i 时,需要达到目标M的操作期望。

定义SUM为权值总和,定义a[i]为将x * i 的权值。

        接下来考虑转移方程:((sum - a[1])/sum) dp[i] = 1 + ((\sum_{j = 1} ^{n} a_{j} * (dp[i * j])(i * j < M))/sum)

        化简之后得到:dp[i] = (sum +(\sum_{j = 1} ^{n} a_{j} * (dp[i * j])(i * j < M)) / (sum - a[1])

    之后就从后往前DP即可,最终输出DP[1].

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
#define int long long
const LL maxn = 4e05+7;
const LL N = 5e05+10;
const LL mod = 998244353;
const int inf = 0x3f3f3f3f;
const LL llinf = 5e18;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >mi;//小根堆
priority_queue<LL> ma;//大根堆
LL gcd(LL a, LL b){
	return b > 0 ? gcd(b , a % b) : a;
}

LL lcm(LL a , LL b){
	return a / gcd(a , b) * b;
}
int n , m;
vector<int>a(N , 0);
void init(int n){
	for(int i = 0 ; i <= n ; i ++){
		a[i] = 0;
	}
}
LL qpow(LL a , LL b)//快速幂
{
	LL sum=1;
	while(b){
		if(b&1){
			sum=sum*a%mod;
		}
		a=a*a%mod;
		b>>=1;
	}
	return sum;
}
int dp[N];//从i到最终状态的期望次数
//sum - a[1] / sum dp[i] = Σ(dp[i * j] * a[i * j] / sum) + 1
// dp[i] = Σdp[i * j] * a[i * j] + sum / sum - a[i]
void solve() 
{
	cin >> n >> m;
	int sum = 0;
	for(int i = 1 ; i <= n ; i ++){
		cin >> a[i];
		sum += a[i];
	}
	for(int i = m - 1 ; i >= 1 ; i --){
		for(int j = 2 ; j <= n && j * i < m ; j ++){
			dp[i] += a[j] * dp[i * j];
			dp[i] %= mod;
		}
		dp[i] += sum;
		dp[i] %= mod;
		dp[i] *= qpow(sum - a[1] , mod - 2);
		dp[i] %= mod;
	}
	cout << dp[1];
}            
signed main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout.precision(10);
    int t=1;
//	cin>>t;
    while(t--)
    {
    	solve();
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习中的各类评价指标

深度学习中的各类评价指标 1 Dice Loss2 Precision&#xff08;精度&#xff09;3 Recall&#xff08;召回率&#xff09;4 F-Score5 mAP 1 Dice Loss Dice Loss&#xff0c;也叫Soft Dice Coefficient&#xff0c;是一种用于图像分割任务的损失函数。它基于目标分割图像与模型…

分库分表,可能真的要退出历史舞台了!

即使是不懂编程的玩家&#xff0c;在对比 NAS 的时候&#xff0c;也会两眼放光&#xff0c;考虑很多因素&#xff0c;比如 RAID 级别、速度、易用程度等。作为时时刻刻与代码打交道的我们&#xff0c;更需要关注数据的存取问题。 一开始&#xff0c;开箱即用的 MySQL&#xff0…

AI一键生成增删改查代码

AI一键生成增删改查代码 在线体验&#xff1a;体验地址 使用教程 1. 描述需求 准确清晰的描述你的需求&#xff0c;如&#xff1a;基于RBAC模型的权限管理系统&#xff0c;点击AI图标 2. AI生成SQL语句 AI将根据你的需求描述生成SQL语句 CREATE TABLE users (id INT A…

高危性行为感染HPV几率有多大?谭巍主任阐述三大要点

高危性行为是指与多个性伴侣发生性行为&#xff0c;或者与性伴侣发生无保护措施的性行为。这些行为增加了感染性传播疾病的风险&#xff0c;包括人乳头瘤病毒(HPV)。 一、HPV感染的风险 1. 性伴侣数量&#xff1a;性伴侣数量越多&#xff0c;感染HPV的几率就越高。与多个性伴…

2023年AMC8数学竞赛真题的典型考点和解析

现在距离2024年1月19日的AMC8数学竞赛还有一个多月的时间&#xff0c;最后一个多月的时间&#xff0c;六分成长建议在前期知识点和内容体系都比较熟悉的基础上&#xff0c;以刷真题为主。同时通过刷真题的查漏补缺&#xff0c;补齐短板。 如何提高刷真题的效率呢&#xff1f;当…

数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树

数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树 什么是二叉树&#xff1f; 二叉树是一种非线性数据结构&#xff0c;代表着祖先与后代之间的派生关系&#xff0c;体现着“一分为二”的分治逻辑。 与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每…

软件测试基础知识总结(超详细整理)

基础篇 1. 什么是软件测试&#xff1f; 软件测试&#xff08;Software Testing&#xff09;的经典定义是&#xff1a;在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。简单来讲就是&am…

【论文翻译】Learning Deep Features for Discriminative Localization

原文&#xff1a;Learning Deep Features for Discriminative Localization 摘要 在这项工作中&#xff0c;我们重新审视了文献[13]中提出的全局平均池化层&#xff0c;并阐明了它如何明确地使卷积神经网络具有出色的定位能力&#xff0c;尽管该网络是在图像级标签上进行训练的…

我的隐私计算学习——隐私集合求交(2)

笔记内容来自多本书籍、学术资料、白皮书及ChatGPT等工具&#xff0c;经由自己阅读后整理而成。 前篇可见&#xff1a;我的隐私计算学习——隐私集合求交&#xff08;1&#xff09; &#xff08;三&#xff09;PSI应用场景问题 ​在目前的实际应用中&#xff0c;衍生出一些新…

【操作系统和计网从入门到深入】(三)进程控制

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

【大数据-Hadoop】从入门到源码编译-概念篇

【大数据-Hadoop】从入门到源码编译-概念篇 Hadoop与大数据生态&#xff08;一&#xff09;Hadoop是什么&#xff1f;&#xff08;二&#xff09;Hadoop组成1. HDFS1.1 NameNode&#xff08;nn&#xff09;1.2 DataNode&#xff08;dn&#xff09;1.3 Secondary NameNode&#…

如雨后春笋般层出不穷的人工智能,究竟可以为我们的生活带来些什么?

似乎是从chatgpt爆火以后&#xff0c;各种各样的和AI、人工智能有关的产品层出不穷&#xff0c;似乎只有带有人工智能&#xff0c;才能体现一个产品的功能之强大&#xff0c;才能在众多产品中具有一定的竞争力&#xff0c;那么这样的现象会给我们的生活带来什么影响呢&#xff…

如何用scratch画正多边形

各边相等&#xff0c;各角也相等的多边形叫做正多边形。 正多边形的外接圆的圆心叫做正多边形的中心。 正多边形的外接圆的半径叫做正多边形的半径。 中心到圆内接正多边形各边的距离叫做边心距。 正多边形各边所对的外接圆的圆心角都相等&#xff0c;这个圆心角叫做正多边…

各行各业模板ppt模板打包下载

下载地址 https://download.csdn.net/download/douluo998/88624912 超多ppt模板 136-高级古风PPT 135-高端艺术PPT 134-高端A4竖版PPT 133-露营活动PPT 132-雷锋主题PPT 131-退休欢送会PPT 130-转正述职报告PPT 129-谷雨PPT 128-课堂互动游戏PPT 127-读书分享PPT -2023-07-22 1…

多线程 (上) - 学习笔记

前置知识 什么是线程和进程? 进程: 是程序的一次执行,一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程: 进程中的一个执行流&#xff0…

计算机操作系统原理分析期末复习

一、理解与识记 三种基本的OS类型及各自的特点&#xff1a; 批处理系统&#xff08;内存同时存放几个作业。优点&#xff1a;资源利用率高、作业吞吐量大、系统开销小&#xff1b;缺点&#xff1a;用户无交互性、作业平均周转时间长&#xff09;、分时系统&#xff08;时间片技…

后端项目全局异常处理-使用RuntimeException自定义异常异常分类简单举例

接上篇&#xff1a;后端项目操作数据库-中枢组件Service调用Mapper 自定义异常&#xff1a; 手动抛出异常&#xff0c;为了后续统一捕获&#xff0c;需要异常自定义&#xff1b; 如&#xff1a;当使用抛出异常的方式表示“操作失败”时&#xff0c;为了后续统一捕获&#xff0c…

信息过载的反思

在今天微信、短视频、图文不停的密集的信息轰炸之下&#xff0c;你“察觉”到你的精力不济没有&#xff1f;你时常会觉得耳鸣、目涩&#xff0c;注意力无法集中&#xff1b;你懒于记忆&#xff0c;甚至爱人的手机号都想不起来&#xff0c;习惯于用移动电话找人名&#xff0c;不…

Docker - Android源码编译与烧写

创建源代码 并挂载到win目录 docker run -v /mnt/f/android8.0:/data/android8.0 -it --name android8.0 49a981f2b85f /bin/bash 使用 docker update 命令动态调整内存限制&#xff1a; 重新运行一个容器 docker run -m 512m my_container 修改运行中容器 显示运行中容器 d…

使用飞书自定义机器人发送消息

使用飞书机器人可以很方便的获取自动化任务的反馈&#xff1a; 在群里创建一个机器人&#xff1a; 记住下面的 webhook地址&#xff0c;这个是标识机器人的唯一ID&#xff0c;比如它的webhook地址是&#xff1a;"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxx-a…