Codeforces Round 521 (Div. 3)

目录

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都是依靠转移的状态是不是只有上一层,然后通过记录上一层的信息来做直接转移而优化一层循环

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

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

相关文章

LeetCode-5. 最长回文子串【字符串 动态规划】

LeetCode-5. 最长回文子串【字符串 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;动态规划五部曲解题思路二&#xff1a;动态规划[版本二]解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文 子串 。 如果字符串的反序…

kubernetes应用的包管理工具---Helm的安装、部署、构建Helm Chart、分发

kubernetes应用的包管理工具—Helm的安装、部署、构建Helm Chart、分发 文章目录 kubernetes应用的包管理工具---Helm的安装、部署、构建Helm Chart、分发1. 引入Helm的原因1.1 没有使用Helm的部署1.2 使用Helm部署 2. Helm核心概念3. Helm架构3.1 V2版本3.2 V3版本 4. Helm安装…

品牌百度百科词条创建多少钱?

百度百科作为国内最具权威和影响力的知识型平台&#xff0c;吸引了无数品牌和企业争相入驻。一个品牌的百度百科词条&#xff0c;不仅是对品牌形象的一种提升&#xff0c;更是增加品牌曝光度、提高品牌知名度的重要途径。品牌百度百科词条创建多少钱&#xff0c;这成为了许多企…

基于SpringBoot+Vue的高校会议室预定管理系统(源码+文档+部署+讲解)

一.系统概述 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套高校会议室预订管理系统&#xff0c;帮助…

【电控笔记0】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

python+appium调@pytest.mark.parametrize返回missing 1 required positional argument:

出错描述&#xff1a; 1、在做pythonappium自动化测试时&#xff0c;使用装饰器pytest.mark.parametrize&#xff08;“参数”&#xff0c;[值1&#xff0c;值2&#xff0c;值3]&#xff09;&#xff0c;测试脚本执行返回test_xx() missing 1 required positional argument:“…

Mybatis generate xml 没有被覆盖

添加插件即可 <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

ssm040安徽新华学院实验中心管理系统的设计与实现+jsp

实验中心管理系统 摘 要 本安徽新华学院实验中心管理系统的设计目标是实现安徽新华学院实验中心的信息化管理&#xff0c;提高管理效率&#xff0c;使得安徽新华学院实验中心管理工作规范化、科学化、高效化。 本文重点阐述了安徽新华学院实验中心管理系统的开发过程&#x…

libcurl 简单实用

LibCurl是一个开源的免费的多协议数据传输开源库&#xff0c;该框架具备跨平台性&#xff0c;开源免费&#xff0c;并提供了包括HTTP、FTP、SMTP、POP3等协议的功能&#xff0c;使用libcurl可以方便地进行网络数据传输操作&#xff0c;如发送HTTP请求、下载文件、发送电子邮件等…

蓝桥杯python速成

总写C&#xff0c;脑子一热&#xff0c;报了个Python&#xff08;有一点想锤死自己&#xff09;&#xff0c;临时抱佛脚了 1.list的插入删除 append extend insert&#xff08;在索引位插入99&#xff09;---忘记用法别慌&#xff0c;用help查询 remove&#xff08;去掉第一个3…

mysql题目2

tj11: select sex,count(sex) from t_athletes group by sex; tj12: select name 姓名,TIMESTAMPDIFF(year,birthday,2024-1-1) 年龄 from t_athletes tj13: SELECT * FROM t_athletesWHERE id NOT IN (SELECT aid FROM t_match WHERE sid IN (SELECT id FROM t_sport WHE…

510天,暴雪竞品迎来大考

北京时间4月10日&#xff0c;暴雪娱乐、微软游戏与网易正式宣布重新达成合作。两则数据值得关注&#xff1a; 一是上午暴雪与网易刚宣布合作&#xff0c;中午《魔兽世界》玩家预约就超过了20W。 截图时间为中午12:48 二是在上午10:24&#xff0c;《炉石传说》官方公众号发布回…

直播视频传输处理技术

流程 在视频直播场景中&#xff0c;从拍摄到手机用户接收的整个过程涉及多个技术环节&#xff1a; 视频采集&#xff1a; 视频源通常来自摄像机或智能手机摄像头&#xff0c;通过捕捉连续的画面生成原始视频信号。 编码压缩&#xff1a; 为了减少数据量以适应网络传输&#x…

一个比 Celery 轻量好用的异步任务工具

文章目录 1、RQ安装2、RQ基本概念2.1、Queue2.2、Job2.3、Worker 3、RQ 高级用法3.1、自定义任务失败处理3.2、任务依赖关系3.3、定时任务 4、RQ web 界面5、查看任务结果6、RQ 与 celery 对比7、总结 Python RQ&#xff08;Redis Queue&#xff09;是一个轻量级的异步任务队列…

c++取经之路(其五)——类和对象拷贝构造函数

概念&#xff1a;拷贝构造函数&#xff0c;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 特征&#xff1a; 1. 拷贝构造函数是构造函数的一个重载形式 如&#xff1a; 2. 拷贝…

最强ChatGPT Plus发布!碾压Claude!ChatGPT5即将发布!

原文链接&#xff1a;ChatGPT发布最新版本&#xff01;新版GPT-4 Turbo重回王座&#xff01;碾压Claude 那个聪明、强大的 ChatGPT&#xff0c;终于又回来了&#xff01; ChatGPT也能用上最强的GPT-4 Turbo了&#xff01;今天&#xff0c;新版GPT-4 Turbo再次重夺大模型排行榜…

Java后端平台的搭建

后端开发准备工作(配置Tomcat) 安装tomcat安装jdk 配置JAVA HONE(到java目录),path(到 bin 目录)解压Tomcat进入到bin目录,双击startup.bat启动tomcat访问 ip端口在conf目录的 server.xml配置端口 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 注:一定要提前配置好Ma…

在Ubuntu上安装Docker Compose

Docker Compose 是一个用于定义和管理Docker容器的工具&#xff0c;它使用yml来配置应用的服务、网络和卷等。特别是在定义多个容器时&#xff0c;它非常擅长定义多个容器之间的关系和依赖。 第一步&#xff1a;更新软件包 sudo apt update第二步&#xff1a;安装网络工具cur…

iOS开发如何更改xcode中的Apple ID

在Xcode中更改Apple ID是一项常见的任务&#xff0c;尤其是当你需要切换到另一个开发者账号或者团队时。下面是一个简单的步骤指南&#xff0c;帮助你更改Xcode中的Apple ID&#xff1a; 步骤一&#xff1a;退出当前的Apple ID 1.打开Xcode应用程序。 2.在菜单栏中&#xff0c;…

Rust面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…