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

news2024/12/30 3:34:23

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;
}

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

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

相关文章

西南交通大学【数据结构实验8】

实验内容及要求&#xff1a; 编写控制台应用程序&#xff0c;提供以下菜单项&#xff1a; 插入元素 从键盘输入若干两两互不相同的非0整数&#xff0c;直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。 插入某个非0整数时&#xff0c;若该整…

Linux——基本指令(二)

​ 个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 写在前面&#xff1a; 紧接上一章&#xff0c;我们在理解接下来的命令之前&#xff0c…

IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知

一、背景 IEEE TIE作为控制领域的TOP期刊&#xff0c;接收机器人、控制、自动驾驶、仪器和传感等方面的论文&#xff0c;当然范围不止这些&#xff0c;感兴趣的可以自行登录TIE官网查看。所投稿论文必须经过实验验证&#xff0c;偏工程应用类&#xff0c;当然也必须有方法上的…

Qt之自定义QToolTip,去掉显示动画和隐藏延时

一.效果 先来看看Qt原生QToolTip的缺点: 1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。 If the text is the same as the currently shown tooltip, the tip will not move. You can force moving by first hiding the t…

LTspice 中电容的类型

目录 背景钽电容、铝电容陶瓷电容新电容技术聚合物铝电容 背景 在 LTspice 中仿真电路时&#xff0c;需要选择合适的电容&#xff0c;由于刚接触 LTspice 和模拟电路&#xff0c;所以不清楚如何选择与实际常用电容对应的型号&#xff0c;于是整理了一个类型列表&#xff0c;方…

飞天使-linux操作的一些技巧与知识点3-http的工作原理

文章目录 http工作原理nginx的正向代理和反向代理的区别一个小技巧dig 命令巧用 http工作原理 http1.0 协议 使用的是短连接&#xff0c;建立一次tcp连接&#xff0c;发起一次http的请求&#xff0c;结束&#xff0c;tcp断开 http1.1 协议使用的是长连接&#xff0c;建立一次tc…

Ubuntu20.04降低linux版本到5.4.0-26-generic

前言 试用ubuntu20.04安装昇腾的驱动和cann的时&#xff0c;出现如下问题&#xff1a; (base) rootubuntu:/home/work# ./Ascend-hdk-910-npu-driver_23.0.rc3_linux-aarch64.run --full Verifying archive integrity... 100% SHA256 checksums are OK. All good. Uncompr…

IDEA 出现问题:git提交commit时Perform code analysis卡住解决方案

问题 git提交commit时Perform code analysis卡住很久 解决方案一 1、打开 IntelliJ IDEA&#xff0c;进入 File -> Settings&#xff08;或者使用快捷键 CtrlAltS&#xff09;。 2、在弹出的 Settings 窗口中&#xff0c;找到 Version Control -> Commit Dialog 选项…

Redis - 事务隔离机制

Redis 的事务的本质是 一组命令的批处理 。这组命令在执行过程中会被顺序地、一次性 全部执行完毕&#xff0c;只要没有出现语法错误&#xff0c;这组命令在执行期间是不会被中断。 当事务中的命令出现语法错误时&#xff0c;整个事务在 exec 执行时会被取消。 如果事务中的…

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

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

排序的简单理解(下)

4.交换排序 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 4.1 冒泡排序 冒泡排序&#xff08…

初始数据库 - 了解数据库

centos 7 版本当中安装 mysql 安装与卸载中&#xff0c;⽤⼾全部切换成为root&#xff0c;⼀旦 安装&#xff0c;普通⽤⼾是可以使用的。 卸载不需要的环境 首先&#xff0c;在安装之前&#xff0c;要先确定你当前系统当中是否已经有了mysql 的环境&#xff0c;如果你不想卸…

2023全国职业院校技能大赛信息安全管理与评估正式赛(模块三CTF)

全国职业院校技能大赛高等职业教育组信息安全管理与评估 \任务书\ 模块三 网络安全渗透、理论技能与职业素养 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xf…

用户案例:系统保留分区未分配驱动器号

“遇到了Win7保留分区无法改变驱动器号的问题。我尝试使用激活工具激活Win7时收到提示&#xff0c;系统保留分区未分配驱动器号。根据网上的建议&#xff0c;我打算在磁盘管理中给保留分区分配驱动号。然而&#xff0c;在电脑中我发现了两个未分配驱动器号的分区&#xff0c;一…

【PTA刷题+代码+详解】求二叉树度为1的结点个数(递归法)

文章目录 题目C代码详解 题目 在二叉树T中&#xff0c;其度为1的结点是指某结点只有左孩子或只有右孩子。利用递归方法求二叉树T的度为1的结点个数。 1&#xff09;如果TNULL&#xff0c;则是空树&#xff0c;度为1的结点个数为0&#xff0c;返回值为0&#xff1b; 2&#xff0…

GEE:重分类

作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)平台上对一副类别图像进行重分类的代码。并以 COPERNICUS/Landcover/100m/Proba-V-C3/Global 数据集中的土地利用数据为例。 结果如下图所示, 文章目录 一、核心函数二、示例代码三、代码链接一、核心函数 核…

保姆级:Windows Server 2012上安装.NET Framework 3.5

目录 一.问题所在无法在安装SQL server2008&#xff08;2012&#xff09; 1.无法安装一下功能 .NET Framework 3.5 二.解决措施 1、打开服务器管理器 2、添加角色和功能 3、选择安装功能 4、指定备用源路径 5、配置本地文件路径 一.问题所在无法在安装SQL server2008&…

【启扬方案】启扬储能管理平板助力储能电站实现智能且高效化运行

在储能领域&#xff0c;储能电站扮演着重要角色&#xff0c;储能电站技术的应用贯穿于电力系统发电、输电、配电、用电的各个环节。实现电力系统削峰填谷、可再生能源发电波动平滑与跟踪计划处理、高效系统调频&#xff0c;增加供电的可靠性。 但随着储能电⼒系统建设发展得越来…

单片机——通信协议(FPGA+c语言应用之iic篇)

一.I2C的功能特点 &#xff08;1&#xff09;功能包括&#xff1a; 1.只需要两条总线&#xff1b; 2.没有严格的波特率要求&#xff0c;例如使用RS232&#xff0c;主设备生成总线时钟&#xff1b; 3.所有组件之间都存在简单的主/从关系&#xff0c;连接到总线的每个设备均可通…

使用Microsoft Dynamics AX 2012 - 9. 核心设置和基本功能

企业的组织结构决定了ERP系统的设置。因此&#xff0c;在开始使用Dynamics AX之前&#xff0c;需要有一个实施项目来设置企业组织和其他核心参数。 实例是Dynamics AX的独立安装&#xff0c;它包含自己的数据库和应用程序。因此&#xff0c;在一个实例中修改配置设置和可编程对…