Codeforces Round 521 (Div. 3)

news2024/11/26 21:18:15

目录

A. Frog Jumping

B. Disturbed People

C. Good Array

D. Cutting Out

E. Thematic Contests

F1. Pictures with Kittens (easy version)

F2. Pictures with Kittens (hard version)


A. Frog Jumping

直接模拟即可注意数据范围需要开long long

void solve(){
    
    LL a,b,k;
    cin>>a>>b>>k;
    cout << (k+1)/2*a - k/2*b << endl;
    return ;
}

B. Disturbed People

简单贪心我们可以发现如果对于一个 1 0 1 那么我调整最后一个1 变为0 是最好的因为这样让后面也只会减少贡献所以调整后面的1即可

void solve(){
    
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    
    int ans = 0;
    for(int i=1;i<=n-2;i++){
    	if(a[i] and !a[i+1] and a[i+2]){
    		ans ++ ;
    		a[i+2]=0;
    	}
    }
    cout << ans << endl;
    return ;
}

C. Good Array

直接按照题目意思模拟即可,同时注意到如果删除的数恰好是后面总和的一半的时候需要特判

void solve(){
    
    map<LL,int> mp;
    cin>>n;
    LL sum =0;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
    	mp[a[i]]++;
    	sum += a[i];
    }
    vector<int> ans;
    for(int i=1;i<=n;i++){
    	LL now = sum -a[i];
    	if(now%2==0 and mp.count(now/2)){
    		if(a[i]*2==now){
    			if(mp[a[i]]>=2) ans.push_back(i);
    		}
    		else ans.push_back(i);
    	}
    }
    cout << ans.size() << endl;
    for(auto&v:ans) cout << v << ' ';
    cout << endl; 
    return ;
}

D. Cutting Out

首先我们可以简单的发现是具有二分性质的,然后我们就可以二分数量,check函数对一个数的个数整除即可,用map记录

bool check(int x){
	int cnt = 0;
	for(auto&[v,w]:mp) cnt += w/x;
	return cnt>=m;
}
void solve(){
    
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	int x; cin>>x;
    	mp[x]++;
    }
    int l=1,r=n;
    while(l<r){
    	int mid=l+r+1>>1;
    	if(check(mid)) l=mid;
    	else r=mid-1;
    }
    vector<int> res;
    for(auto&[v,w]:mp){
    	int t = w/l;
    	while(t--) res.push_back(v);
    }
    for(int i=0;i<m;i++) cout<<res[i]<<' ';
    cout<<endl;
    return ;
}

E. Thematic Contests

注意厘清题目意思,对于每一个数我们只在乎的是它的数量,然后对于题目意思的翻倍处理可以明显的知道最多只会处理20次以内2^{20}>1e6,所以对于整个数的来取得的话我们直接看后20位即可,同时对于开头第一个数肯定是 1-smax,记录一下即可,简单判断时间复杂度是可行的

map<LL,int> mp;
int check(int x){
	int sum = 0;
	for(int i=max(1,n-20);i<=n;i++){
		if(a[i]>=x){
			sum += x;
			x *= 2;
		}
	}
	return sum;
}
void solve(){
    
    cin>>n;
    for(int i=1;i<=n;i++){
    	int x; cin>>x;
    	mp[x]++;
    	smax=max(smax,mp[x]);
    }
    for(auto&[v,w]:mp){
    	a[++m]=w;
    }
    sort(a+1,a+1+m);
    
    int ans = 1;
    for(int i=1;i<=smax;i++){
    	ans = max(ans,check(i));
    }
    cout << ans << endl;
    return ;
}

F1. Pictures with Kittens (easy version)

我们可以明显的看出这是最优性问题,我们考虑dp,首先定义状态,首先第一是数量,第二维就是当前整个数选的是什么位置,同时转移来源是对于当前要选的数的前k个以内的,所以转移是ok的,同时注意求最大值,也就是一开始有些是不可以转移的,所以定义为负无穷即可

LL dp[M][M];
int w[M];
 
void solve(){
    
    cin>>n>>k>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    
    for(int i=0;i<=n;i++)
    	for(int j=0;j<=n;j++)
    		dp[i][j]=-1e18;
    
    dp[0][0]=0;
    
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=i and j<=m;j++)
    		for(int u=max(i-k,0);u<i;u++){
    			dp[j][i]=max(dp[j][i],dp[j-1][u]+w[i]);
    		}
    LL ans = -1;
    for(int i=n-k+1;i<=n;i++) ans = max(ans,dp[m][i]);
    cout << ans << endl;
    return ;
}

F2. Pictures with Kittens (hard version)

依照上一题的分析同时我们注意到数据范围也就是只能是用n^2的时间复杂度来通过本题,我们在上题的分析基础上分析,可以发现dp[i](选的第i个数的转移来源 一定是选的第i-1个数)所以考虑对此优化,当我选第i个数的时候选到第j个位置时,后面的选到第j+1的数只能由dp[i-1][(max(0,j-k),j]组成这个状态的变化可以通过在转移j的同时用单调队列优化上一层的状态,这样就是满足要求的时间复杂度

LL dp[M][M];
int w[M];
 
void solve(){
    
    cin>>n>>k>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    
    if(n/k>m){
    	cout<<-1<<endl;
    	return ;
    }
    for(int i=0;i<=n;i++)
    	for(int j=0;j<=n;j++)
    		dp[i][j]=-1e18;
    
    dp[0][0]=0;
    
    for(int i=1;i<=m;i++){
    	deque<int> q;
    	q.push_back(0);
    	for(int j=1;j<=n;j++){
    		while(!q.empty() and j-q.front()>k) q.pop_front();
    		dp[i][j]=dp[i-1][q.front()]+w[j];
    		while(!q.empty() and dp[i-1][j]>=dp[i-1][q.back()]) q.pop_back();
    		q.push_back(j);
    	}	
    }
    LL ans = -1;
    for(int i=n-k+1;i<=n;i++) ans = max(ans,dp[m][i]);
    cout << ans << endl;
    return ;
}

常见的dp从n^3-->n^2都是依靠转移的状态是不是只有上一层,然后通过记录上一层的信息来做直接转移而优化一层循环

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

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

相关文章

【七 (2)FineBI-平台新增用户留存分析】

目录 文章导航一、字段解释1、用户平台登录信息表格2、用户平台激活信息表格 二、需求三、操作步骤1、建立用户平台登录信息表格和用户平台激活信息表格的关联关系2、将用户平台激活信息表格的激活日期添加到用户平台登录信息表格3、新增公式列&#xff0c;计算激活时间和登录时…

超详细的YOLOv8项目组成解析:一站式指南了解其架构与组件

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 项目结构 1. .github 2. docker 2.1 docker/Dockerfile 2.2 docker/Dockerfile-arm64 2.3 docker/Dockerfile-conda 2.4 docker/Dockerfile-cpu 2.5 docker/Dockerfile-jetson 2.6 docker/D…

SQLite 在Android安装与定制方案(十七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite超详细的编译时选项&#xff08;十六&#xff09; 下一篇&#xff1a;SQLite Android 绑定&#xff08;十八&#xff09; 安装 有三种方法可以将 SQLite Android 绑定添加到应用程序&#xff1a; 1、通过…

【linux深入剖析】动态库的使用(续) | 动静态库的链接

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 回顾1. 打包库的使用2. 动…

MATLAB如何分析根轨迹(rlocus)

根轨迹分析是一种图形化方法&#xff0c;用于研究闭环极点随系统参数&#xff08;通常是反馈增益&#xff09;变化时的移动情况。 绘制根轨迹目的就是改变系统的闭环极点,使得系统由不稳定变为稳定或者使得稳定的系统变得更加稳定。 主导极点 主导极点就是离虚轴最近的闭环极…

vmware虚拟机进不去系统补救

更新了虚拟机里面工具和资料&#xff0c;进行了磁盘整理和压缩&#xff0c;虚拟机运行进不去系统了。 网站找的修复方法均不可行。补救措施&#xff1a;利用DiskGenius.exe&#xff08;要用高版本不然复制的时候就知道了&#xff09; DG1342.rar - 蓝奏云 加载虚拟硬盘 2008x…

适用于 Mac 的 10 大数据恢复工具,具有优点、缺点

数据丢失很常见&#xff0c;并且可能由于许多不同的原因而发生。这种情况在我和我们团队的其他成员身上发生过很多次&#xff0c;即使我们格外小心我们的个人存储设备。 幸运的是&#xff0c;数据恢复软件在大多数情况下都可以工作。但是&#xff0c;由于数据丢失场景彼此之间…

java Web 中小企业门户网站用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 中小企业门户网站是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

MySQL如何定位慢查询?如何分析这条慢查询?

常见的慢查询 聚合查询&#xff08;常用的聚合函数有&#xff1a;MAX&#xff08;&#xff09;、MIN&#xff08;&#xff09;、COUNT&#xff08;&#xff09;、SUM&#xff08;&#xff09;、AVG&#xff08;&#xff09;&#xff09;。 多表查询 表数据过大查询 深度分页…

刷题之动态规划-两个数组

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的两个数组类型相关的题目 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是动态规划的核心步骤&#xff0…

APP下载页前端自适应HTML源码

源码介绍 APP下载页前端自适应HTML源码&#xff0c;可以作为自己的软件介绍页或者app下载页&#xff0c;喜欢的朋友可以拿去研究 效果预览 HTML源码下载 https://www.qqmu.com/3026.html

SpringCloud集成SkyWalking链路追踪并收集日志2

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

第6章 6.1.1 文本格式化 sprintf函数(MATLAB入门课程)

sprintf函数源自 C 语言标准库中的同名函数&#xff0c;这个函数在 C 语言中用于创建格式化的字符串&#xff0c;且使用频率非常高。作为一门高级编程语言&#xff0c;MATLAB借鉴了 C 语言和其他编程语言中的许多特性和命名惯例。在MATLAB中&#xff0c;sprintf函数主要有两种用…

使用unicloud-map 无法展示poi的天坑

天坑&#xff01;天坑&#xff01;天坑 使用unicloud-map的天坑 202404121722&#xff0c;昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败&#xff0c;一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的&#xff0c;所以今…

大厂Java笔试题之找出组成一个偶数最大的两个素数

题目&#xff1a;找出组成一个大于2的偶数最接近的两个素数。 比如 输入20 输出7 13 注意&#xff1a;这里有一个理论&#xff0c;任意一个大于2的偶数&#xff0c;都能找到2个素数&#xff0c;相加等于这个偶数。 public class Demo10 {public static void main(String[] ar…

python入门(一)配置环境和选择IDE

Python&#xff0c;作为一种简洁易懂的编程语言&#xff0c;近年来在全球范围内受到了广泛的关注和追捧。它不仅语法简单明了&#xff0c;易于上手&#xff0c;而且拥有强大的第三方库和广泛的应用领域。从数据分析、机器学习到Web开发&#xff0c;Python都能发挥出色的性能&am…

Python 全栈体系【四阶】(三十)

第五章 深度学习 四、Tensorflow 8. 模型保存与加载 8.1 什么是模型保存与加载 模型训练可能是一个很长的过程&#xff0c;如果每次执行预测之前都重新训练&#xff0c;会非常耗时&#xff0c;所以几乎所有人工智能框架都提供了模型保存与加载功能&#xff0c;使得模型训练完…

2024年MathorCup数模竞赛B题问题一二三+部分代码分享

inputFolderPath E:\oracle\images\; outputFolderPath E:\oracle\process\; % 获取文件夹中所有图片的文件列表 imageFiles dir(fullfile(inputFolderPath, *.jpg)); % 设置colorbar范围阈值 threshold 120; % 遍历每个图片文件 for i 1:length(imageFiles) % 读…

【NLP练习】调用Gensim库训练Word2Vec模型

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1.安装Gensim库 使用pip安装&#xff1a; !pip install gensim2. 对原始语料分词 选择《人民的民义》的小说原文作为语料&#xff0c;先采用…

12.4.1 实验1:配置CDP

12.4.1 实验1&#xff1a;配置CDP 1、实验目的 通过本实验可以掌握: CDP特征。CDP配置和调试方法。通过CDP查看设备直连邻居信息的方法。 2、实验拓扑 配置CDP的实验拓扑如上图所示。 3、实验步骤 &#xff08;1&#xff09;配置路由器R1 R1(config)#interface serial 0…