Codeforces 938 div3 A-G

news2024/9/8 23:20:47

A

分析

签到题

C++代码

#include<iostream>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,a,b,sum=0;
		cin>>n>>a>>b;
		if(a*2>b){
			sum+=n/2*b+n%2*a;
		}else sum+=n*a;
		cout<<sum<<endl;
	} 
	return 0;
}

 B

分析

用最小的数作为矩阵第一个数,map记录给出的每个数的个数,然后直接根据公式判断算出来的数是否存在即可

C++代码

#include<iostream>
#include<map>
using namespace std;
int n,c,d;
void solve(){
	cin>>n>>c>>d;
	int a[n+5][n+5];
	int sta=1e9,flag=0;
	map<int,int> cnt;
	for(int i=1;i<=n*n;i++){
		int x;
		cin>>x;
		cnt[x]++;
		sta=min(sta,x);
	}
	a[1][1]=sta;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(i==1&&j==1)continue;
			else if(i==1&&cnt[a[1][j-1]+d]){//第一行
				a[1][j]=a[1][j-1]+d;
				cnt[a[i][j]]--;
			}else if(j==1&&cnt[a[i-1][1]+c]){//第一列
				a[i][1]=a[i-1][1]+c;
				cnt[a[i][j]]--;
			}else if(i>1&&j>1&&cnt[a[i-1][j]+c]&&a[i-1][j]+c==a[i][j-1]+d){
				a[i][j]=a[i-1][j]+c;
				cnt[a[i][j]]--;
			}else flag=1;
		}
	if(flag)puts("NO");
	else puts("YES");
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	} 
	return 0;
}

 C

分析

一共攻击k次,假设所有的a[i]的总和为s

1、k>=s,所有船都会被打爆,可以沉n艘船

2、k<s,左边会打 (k+1)/2 次,右边打 k/2 次,设置前缀和和后缀和(也可以不设置,做的时候实时更新即可),然后判断从前往后第几艘船打不下来,从后往前第几艘船打不下来,然后计算答案

C++代码

#include<iostream>
using namespace std;
typedef long long LL;
const int N=200010;
LL a[N],s[N],last[N];//s[i]前缀和,last[i]后缀和 
void solve(){
	LL n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i],s[i]=s[i-1]+a[i];
	last[n+1]=0;
	for(int i=n;i>=1;i--)last[i]=last[i+1]+a[i];
	if(k>=s[n]){//k大于等于所有的a[i]的和,则一定可以让所有的船都沉 
		cout<<n<<endl;
		return;
	}
	//一共k步,左边k/2上取整步,右边k/2下取整步 
	LL left=(k+1)/2,right=k/2,ans=0;
	for(int i=1;i<=n;i++)
		if(s[i]>left){
			ans+=i-1;//第i艘船打不下来,i前面的所有船都可以沉 
			break;
		}
	for(int i=n;i>=1;i--)
		if(last[i]>right){
			ans+=n-i;//第i艘船打不下来,i后面的所有船都可以沉 
			break;
		}
	cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

 D

分析

这题的做法类似于滑动窗口,但是没有真的把滑动窗口写出来,而是每次直接记录滑动窗口内的每个数的个数,判断其中可以与b数组里面的数匹配的数的个数,简称有效数的个数

由于每个数都可能有重复元素,所以在累计有效数的时候要判断一下是否该数的个数已经超过b数组中该数的个数,超过则超过部分无效,删除的时候类似

C++代码

#include<iostream>
#include<map>
using namespace std;
const int N=200010;
int a[N],b[N];
void solve(){
	int n,m,k,ans=0;
	cin>>n>>m>>k;
	//mp记录b[i]中的数及出现次数,mp1记录滑动窗口中的数及出现次数 
	map<int,int> mp,mp1;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++)cin>>b[i],mp[b[i]]++;
	int cnt=0;//记录有效的数的个数
	for(int i=1;i<=n;i++){
		if(i<=m){
			mp1[a[i]]++;
			if(mp1[a[i]]<=mp[a[i]])cnt++;
			if(i==m&&cnt>=k)ans++;
		}else{
			//当前滑动窗口内的数是a[i-m+1~i],所以要把a[i-m]踢出窗口 
			mp1[a[i-m]]--;
			//如果删之前mp1[a[i-m]]<=mp[a[i-m]],则删除后,窗口内有效的数就减少一个 
			if(mp1[a[i-m]]<mp[a[i-m]])cnt--;
			//把a[i]加入滑动窗口 
			mp1[a[i]]++;
			if(mp1[a[i]]<=mp[a[i]])cnt++;//mp1[a[i]]<=mp[a[i]],有效的数增加一个 
			if(cnt>=k)ans++;
		}
	}
	cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

E

分析

直接从大到小枚举k,只要遇到可行的k就跳出循环直接输出

对于每个k,从前往后遍历原数组a,每次遇到0就修改从当前位置往后的k个数,直接修改是不可取的,会超时,修改区间可以借助差分来解决

C++代码 

#include<iostream>
using namespace std;
const int N=5010;
char s[N];
int n,k;
void solve(){
	scanf("%d%s",&n,s+1);
	for(k=n;k>=1;k--){
		int a[N];
		for(int i=1;i<=n;i++)a[i]=s[i]-'0';
        //把a变成a的差分数组,一定要倒着异或,否则就会用已经异或的值异或后面的数
		for(int i=n;i>=1;i--)a[i]^=a[i-1];
		int flag=0;
		for(int i=1;i<=n;i++){
			a[i]^=a[i-1];//求出a[i]
			if(a[i]==0){//如果a[i]=0,则直接翻转修改区间[i,i+k-1]
				if(i+k-1>n){//i+k-1>n,则不能修改,此时的k不可行,flag=1
					flag=1;
					break;
				}
                //修改a[i ~ i+k-1]的区间
				a[i]^=1,a[i+k]^=1;
			}
		}
		if(!flag)break;
	}
	cout<<k<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	} 
	return 0;
} 

 F

分析

根据题目,可以挖掘出Bob赢的一些充分条件:

1、4的个数必须为偶数

2、1,2,3的个数的奇偶性相同

每次只能删一个数,所以4对答案的贡献为d/2(假设当前1,2,3的奇偶性已经相同,则可以一直删4,直到删完为止。删的时候会发现(d+1)/2个奇数d/2个偶数,所以对答案的贡献为d/2)

同理,对于1,2,3也一样,假设当前2,3的奇偶性相同,则一直删1,每删一个,就变一次奇偶性,贡献也是a/2,2和3同理,贡献为b/2和c/2

但是1,2,3的个数最开始都是奇数时,每个数贡献a/2,b/2,c/2后,最后剩下的情况就是1,1,1,0,此时的贡献也为1

C++代码


#include<iostream>
using namespace std;
//4的个数为偶数, 1、2、3的个数的奇偶性相同
void solve(){
	int a,b,c,d,ans=0;
	cin>>a>>b>>c>>d;
	if(a%2&&b%2&&c%2)ans++;
	ans+=a/2+b/2+c/2+d/2;
	cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

 G

分析

由于路径是从(1,1)开始的,所以最大公约数一定是他的约数,直接从前往后枚举他的每一个约数即可,由于约数都是成对出现的,所以直接用根号n的时间复杂度枚举约数

对于每个约数k,用dp判断是否可以成立

dp[i][j]:

集合:所有从(1,1)走到(i,j)的所有选法

属性:bool(是否存在一条路中每个数都是k的倍数)

C++代码

#include<iostream>
using namespace std;
const int N=110;
int a[N][N],dp[N][N];
int n,m;
bool check(int k){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(i==1&&j==1)dp[i][j]=1;
			else if(a[i][j]%k==0&&(dp[i-1][j]||dp[i][j-1]))dp[i][j]=1;
			else dp[i][j]=0;
		}
	return dp[n][m]==1;
} 
void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j],dp[i][j]=0;
	int maxx=0;
	for(int i=1;i*i<=a[1][1];i++){//枚举a[1][1]的所有因子 
		if(a[1][1]%i==0){
			if(check(i))maxx=max(maxx,i);
			if(check(a[1][1]/i)){
				maxx=max(maxx,a[1][1]/i);
				break;
			}
		}
	}
	cout<<maxx<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

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

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

相关文章

代码随想录 day 25 回溯

第七章 回溯算法 part04 491.递增子序列 本题和大家刚做过的 90.子集II 非常像&#xff0c;但又很不一样&#xff0c;很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解&#xff1a;https://www.bilibili.com/vi…

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12&#xff0c;开发者工具&#xff0c;网络 1、web基本概念 web服务器&#xff08;web server&#xff09;&#xff1a;也称HTTP服务器&#xff08;HTTP server&#xff09;&am…

解决Windows密码丢失问题:详细指南

解决Windows密码丢失问题&#xff1a;详细指南 引言 最近因为某些工作缘故&#xff0c;接触到windows比较频繁&#xff0c;特此记录一下 当下&#xff0c;计算机安全是每个人都不能忽视的重要问题。然而&#xff0c;有时可能因为忘记密码而无法访问自己的Windows系统&#xf…

NAS、SAN 与 DAS 的比较与应用场景

文章目录 1. NAS&#xff08;网络附加存储&#xff09;定义特点实现成本&#xff1a;适用场景 2. SAN&#xff08;存储区域网络&#xff09;定义特点实现成本&#xff1a;适用场景 3. DAS&#xff08;直接附加存储&#xff09;定义特点实现成本&#xff1a;适用场景 区别总结结…

基于tkinter的学生信息管理系统之登录界面和主界面菜单设计

目录 一、tkinter的介绍 二、登陆界面的设计 1、登陆界面完整代码 2、部分代码讲解 3、登录的数据模型设计 4、效果展示 三、学生主界面菜单设计 1、学生主界面菜单设计完整代码 2、 部分代码讲解 3、效果展示 四、数据库的模型设计 欢迎大家进来学习和支持&#xff01…

文件操作相关的精讲

目录&#xff1a; 思维导图 一. 文件定义 二. 文件的打开和关闭 三. 文件的顺序读写操作 四. 文件的随机读写操作 五. 文本文件和二进制文件 六. 文件读取结束的判断 七.文件缓冲区 思维导图&#xff1a; 一. 文件定义 1.文件定义 C语言中&#xff0c;文件是指一组相…

Chapter 18 Python异常

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、什么是异常二、捕获异常三、异常的传递 前言 在Python中&#xff0c;异常是一种特定的对象&#xff0c;能够在程序运行过程中被抛出和处理。有效地管理异常不仅可以…

Spark+实例解读

第一部分 Spark入门 学习教程&#xff1a;Spark 教程 | Spark 教程 Spark 集成了许多大数据工具&#xff0c;例如 Spark 可以处理任何 Hadoop 数据源&#xff0c;也能在 Hadoop 集群上执行。大数据业内有个共识认为&#xff0c;Spark 只是Hadoop MapReduce 的扩展&#xff08…

精准客户从何而来?一招让你的客户源源不断!

你们是否还在为找不到精准客户而烦恼&#xff1f; 今天&#xff0c;我要分享一招非常实用的技巧&#xff0c;让你也能拥有源源不断的客源&#xff01; 首先&#xff0c;我们需要深入了解自己的目标客户。他们是谁&#xff1f;他们的需求是什么&#xff1f;并利用大数据洞察客…

Cocos Creator文档学习记录

Cocos Creator文档学习记录 一、什么是Cocos Creator 官方文档链接&#xff1a;Hello World | Cocos Creator 百度百科&#xff1a;Cocos Creator_百度百科 Cocos Creator包括开发和调试、商业化 SDK 的集成、多平台发布、测试、上线这一整套工作流程&#xff0c;可多次的迭…

【前端 19】使用Vue-CLI脚手架构建Vue2项目

使用Vue CLI构建Vue 2项目 引言 Vue.js 是一个构建用户界面的渐进式JavaScript框架&#xff0c;以其轻量级和易用性受到前端开发者的广泛喜爱。Vue CLI&#xff08;Vue Command Line Interface&#xff09;是一个基于Vue.js进行快速开发的完整系统&#xff0c;提供了零配置的项…

Amazon Bedrock + Amazon DynamoDB 数据设计与建模

一、Amazon DynamoDB简介 在当今数字化转型的浪潮中&#xff0c;企业对数据处理能力的需求日益增长&#xff0c;为了应对大规模数据和高并发访问的挑战&#xff0c;选择一款合适的数据库解决方案变得尤为重要。 Amazon DynamoDB&#xff0c;作为亚马逊云科技提供的一种完全托…

【人工智能】Transformers之Pipeline(六):图像分类(image-classification)

目录 一、引言 二、图像分类&#xff08;image-classification&#xff09; 2.1 概述 2.2 技术原理 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#x…

文远知行IPO,L4的梦还是L2给的

文&#xff5c;刘俊宏 编&#xff5c;王一粟 随着萝卜快跑在武汉初步验证了Robotaxi商业闭环&#xff0c;L4自动驾驶的公司们终于迎来了“黎明的曙光”。 7月27日&#xff0c;文远知行向美国SEC&#xff08;证券交易委员会&#xff09;提交了招股书&#xff0c;以超越Moment…

Flask Bootstrap #2 - MVC架构

Reference https://medium.com/%E5%B7%A5%E7%A8%8B%E9%9A%A8%E5%AF%AB%E7%AD%86%E8%A8%98/%E4%BD%BF%E7%94%A8-python-flask-%E5%BB%BA%E7%AB%8B%E7%B6%B2%E7%AB%99-353e449a9bc8 1 MVC架构 在 Flask Boostrap #1 - 安装Flask 透过 app.route() 建立路由是 flask API 常见的…

实验2-4-1 求1到N的和*--sum记得累加啊!

//实验2-4-1 求1到N的和//计算序列 1 2 3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N,sum0;scanf("%d",&N);for(int a1;a<N;a){ suma;//sum进行累加&#xff01;&#xff01;&#xff01;&#xff01;&#xff01…

VS2019编译和使用gtest测试(C++)

目录 一、首先下载gtest开源 二、使用gtest 一、首先下载gtest开源 https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码&#xff1a;vfxz 下载下来解压到文件夹&#xff0c;再在文件夹里面新建一个build文件夹&#xff0c;如下&#xff1a; 再安装cmake&#xff0c;…

Cocos Creator2D游戏开发(6)-飞机大战(4)-敌机产生

敌机产生&玩家发射子弹 敌机产生: 创建一个空节点 创建一个敌机预制体 把敌机图片拖入预制体内 使用代码生成敌机 让敌机动起来 创建一个预制体enemy_prefab双击预制体enemy_prefab,然后拖入一个敌机图片,设置好方向和尺寸,一定要记得保存然后关闭(场景编辑器里面的保存)…

【前端 18】安装Node.js

Node.js 安装指南 在今天的博客中&#xff0c;我们将一起探讨如何在您的计算机上安装Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许你在服务器端运行 JavaScript 代码。无论您是前端开发者希望探索全栈开发&#xff0c;还是后端开发者寻…

【ROS 最简单教程 002/300】ROS 环境安装 (虚拟机版): Noetic

&#x1f497; 有遇到安装问题可以留言呀 ~ 当时踩了挺多坑&#xff0c;能帮忙解决的我会尽力 &#xff01; 1. 安装操作系统环境 Linux ❄️ VM / VirtualBox Ubuntu20.04 &#x1f449; 保姆级图文安装教程指路&#xff0c;有经验的话 可以用如下资源自行安装 ITEMREFERENCE…