Educational Codeforces Round 145 (Rated for Div. 2) (A~E)

Problem - B - Codeforces

思路:

  1. 我们选择长度后,其特定长度会构成一个正方形,因为点与点距离大于1,所以偶数的正方形里面只能包含偶数的正方形,奇数的包含奇数。
  2. 计算每个长度容纳最大点数:
    1. 发现cnt[0]=1,cnt[2]=9,cnt[4]=25
    2. cnt[1]=4,cnt[3]=16,cnt[5]=36。
    3. 发现最大长度n容纳点数为(n+1)^{2}

所以对于给定的n,我们求根号得到ans,如果ans*ans==n-1,答案是ans。否则 (即ans*ans<n)是ans,因为得出是ans.小数(即ans可以容纳(ans+1)^2的点数)

#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF

void mysolve()
{
	int n;
	cin>>n;
	int ans=sqrt(n);
	if (ans*ans==n)ans--;
	cout<<ans<<endl;
}
int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t;
	cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - C - Codeforces

思路:

我们尝试凑成2,2,2,2,x,-1000,-1000的形式

  1. 我们现在前面凑i个2,那么当前有\frac{(i+1)*i}{2}个整数,且\frac{(i+1)*i}{2}<=k。
  2. 当凑的i最大时,显然接下来凑第i+1个增加i+1个正数会超过k。先让k-(i+1)*i/2.
  3. 那么,我们改为凑一个负数,他与子数组刚好构成剩下的k个整数,那么他的值就是-2*(i-k)。当然这样写会有一个是0,所以我们加1,就保证不会增加一个整数,也不会中和出一个0.
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 2e5 + 10;

void mysolve()
{
	int n,k;
	cin>>n>>k;
	vector<int>v;
	for (int i=1; i<=n; ++i)
		{
			if (k-i>=0)
				{
					k-=i;
					v.push_back(2);
				}
			else if (k>0)
				{
					v.push_back(-2*(i-k)+1);
					k=0;
				}
			else
				{
					v.push_back(-1000);
				}
		}
	for (int i=0; i<n; ++i)cout<<v[i]<<" ";
	cout<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t;
	cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - D - Codeforces

很直观的一种是直接dp,另一种是观察出最多交换一次,剩下都是删除

思路1:DP

dp[i][0]表示完成到i下标,其结尾是0

dp[i][1]表示结尾是1

dp[i][2]表示结尾是1且串里面不止一个1(只有一个1的情况不考虑在这里)

#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 3e5 + 10;
int dp[N][5];
void mysolve()
{
	string s;
	cin>>s;
	int len=(int)s.size();
	int a=1e12,b=a+1;
	for (int i=0; i<=len; ++i)dp[i][0]=dp[i][1]=dp[i][2]=llINF;
	dp[0][0]=0;
	for (int i=1; i<=len; ++i)
		{
			if (s[i-1]=='0')
				{
					dp[i][0]=dp[i-1][0];
					dp[i][1]=dp[i-1][1]+a;//原来有一个1,可以交换
					dp[i][2]=dp[i-1][2]+b;//原来有多个1,那这个0还是删了吧
				}
			else
				{
					dp[i][0]=dp[i-1][0]+b;//前面都是0,这里1要删除
					dp[i][1]=dp[i-1][0];//前面都是0,才能保证最后一个1放入后只有一个1
					dp[i][2]=min(dp[i-1][1],dp[i-1][2]);
				}
		}
	int ans=min(dp[len][0],min(dp[len][1],dp[len][2]));
	cout<<ans<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t;
	cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

思路2:观察出最多交换一次,剩下都是删除

  1. 我们如果交换2次及以上,说明他的交换最后必定有连续的成分,那么连续的交换不如我直接删除。
  2. 交换有贡献的情况只有s[i]=0&&s[i-1]=1的情况,所有我们遍历n寻找是否存在这样的情况,有就交换一次,剩下前面的1与后面的0全部删除
  3. 我们可以用前缀和记录1的个数
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 3e5 + 10;
int cnt[N];
void mysolve()
{
	string s;
	cin>>s;
	ll ans=llINF,b=1e12+1;
	int n=(int)s.size();
	cnt[0]=(s[0]=='1');
	for (int i=1; i<n; ++i)cnt[i]=cnt[i-1]+(s[i]=='1');
	for (int i=0; i<n; ++i)
		{
			int cnt1=cnt[i-1],cnt0=n-i-1-(cnt[n-1]-cnt[i]);
			if (i>0&&s[i]=='0'&&s[i-1]=='1')ans=min(ans,b*(cnt1+cnt0)-1);//cnt[i-1]下标i前面1个数,n-i-(cnt[n-1]-cnt[i]),下标i后面0个数
			else ans=min(ans,b*(cnt1+cnt0));
		}
	cout<<ans<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t;
	cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - E - Codeforces

思路:模拟确定上下限

  1. 因为两个杯子的水的和是不会变的,所以我们可以根据和来讨论情况,遍历(0,a+b),那么杯子a每次最少取l=min(0,i-b),最多取r=max(a,i)
  2. 如果中间的数没有过上下溢出,记录操作的和。那么不会溢出的话,那么初始为j,答案就是j-sum。
  3. 显然,每次操作是边界最容易溢出,那么我们只需要讨论左右边界经过所有操作后,左边界至少取多少,右边界至少取多少。
    1. 显然,中间取的数,如果溢出过一次左边界,等于他与左边界同化了,那么他后续被操作的情况应该与左边界的值一样,那么他最终的值就是左边界最终的值
    2. 同理,如果中间数溢出过一次右边界,那么他被右边界同化,答案是右边界的值
    3. 如果左右都没溢出,恭喜他被逼入绝境,他只能取j-sum(j为第一个杯子的起始值)
  4. 所以答案就3个,最少取左边界最终值lo(至少来过一次左边界就会是这个值),最多取右边界最终值hi(至少来过一次右边界就会是这个值)。不然一个边界没去只能j-sum
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
const int N = 1e3 + 10;

int v[N*10];
int ans[N][N];
void mysolve()
{
	int n,a,b;
	cin>>n>>a>>b;
	int sum=0;
	for (int i=1; i<=n; ++i)cin>>v[i],sum+=v[i];
	for (int i=0; i<=a+b; ++i)
		{
			int l=max(0ll,i-b),r=min(a,i);
			int lo=l,hi=r;
			for (int j=1; j<=n; ++j)
				{
					lo=max(min(lo-v[j],r),l);//更新左边界
					hi=min(max(hi-v[j],l),r);//更新右边界
				}
			for (int j=l; j<=r; ++j)ans[j][i-j]=max(lo,min(hi,j-sum));
		}
	for (int i=0; i<=a; ++i)for (int j=0; j<=b; ++j)cout<<ans[i][j]<<" \n"[j==b];
	//学到的换行新姿势," \n"[]是一个数组,如果括号内为假,取数组[0],为真,取数组[1]
}
int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	mysolve();
	system("pause");
	return 0;
}

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

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

相关文章

WPF毛笔字实现过程

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Python中生产者消费者模型

Python生产者消费者模型 一、消费模式 生产者消费者模式 是Controlnet网络中特有的一种传输数据的模式。用于两个CPU之间传输数据&#xff0c;即使是不同类型同一厂家的CPU也可以通过设置来使用。 二、传输原理 类似与点对点传送&#xff0c;又略有不同&#xff0c;一个生产…

能把爬虫讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

前言 可以说很多人学编程&#xff0c;不玩点爬虫确实少了很多意思&#xff0c;不管是业余、接私活还是职业爬虫&#xff0c;爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫&#xff0c;目的是让准备学爬虫或者刚开始起步的小伙伴们&#xff0c;对爬虫有一个更深更全的认知…

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展&#xff0c;自然语言处理技术也逐渐成为了研究的热点之一。其中&#xff0c;ChatGPT作为一项领先的自然语言处理技术…

【软件测试】基础知识第一篇

文章目录一. 什么是软件测试二. 测试和调试的区别三. 什么是测试用例四. 软件的生命周期五. 软件测试的生命周期一. 什么是软件测试 软件测试就是验证软件产品特性是否满足用户的需求。 那需求又是什么呢&#xff1f;在多数软件公司&#xff0c;会有两种需求&#xff0c;一种…

【vue3】小小入门介绍

⭐【前言】 首先&#xff0c;恭喜你打开了一个系统化的学习专栏&#xff0c;在这个vue专栏中&#xff0c;大家可以根据博主发布文章的时间顺序进行一个学习。博主vue专栏指南在这&#xff1a;vue专栏的学习指南 &#x1f973;博主&#xff1a;初映CY的前说(前端领域) &#x1f…

python自动发送邮件,qq邮箱、网易邮箱自动发送和回复

在python中&#xff0c;我们可以用程序来实现向别人的邮箱自动发送一封邮件&#xff0c;甚至可以定时&#xff0c;如每天8点钟准时给某人发送一封邮件。今天&#xff0c;我们就来学习一下&#xff0c;如何向qq邮箱&#xff0c;网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…

new动态内库管理库学习

new文件是动态内存管理库的一部分&#xff0c;特别提供低层内存管理特性。 它包括bad_alloc, bad_array_new_length&#xff0c;nothrow_t&#xff0c;align_val_t类nothrow常量&#xff0c;以及函数 operator newoperator new[],operator deleteoperator delete[],get_new_han…

微信小程序登录注册页面

// login.js // 获取应用实例 var app getApp() var api require("../../utils/api.js")Page({data: {motto: zhenbei V1.0.0,userInfo: {},hasUserInfo: false,disabled: true,btnstate: default,username: ,password: ,canIUse: wx.canIUse(button.open-type.get…

Python实现人脸识别检测, 对美女主播照片进行评分排名

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 素材、视频、代码、插件安装教程我都准备好了&#xff0c;直接在文末名片自取就可点击此处跳转 开发环境: Python 3.8 Pycharm 2021.2 模块使用&#xff1a; requests >>> pip install requests tqdm >…

如何利用WDM波分复用技术来扩展光纤容量?

文章导读&#xff1a; 如何利用WDM来扩展光纤容量&#xff1f; 什么是Mux合波和Demux分波&#xff1f; CWDM, DWDM, OADM 了解WDM的常用波段 WDM技术&#xff1a;TFF和AWG WDM-PON应用于接入网 WDM网络拓扑在5G传输中的应用 网络提供商一直面临着如何应对不断扩大的带宽需求&a…

【Pytorch】利用PyTorch实现图像识别

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 这是目录使用torchvision库的datasets类加载常用的数据集或自定义数据集使用torchvision库进行数据增强和变换&#xff0c;自定义自己的图像分类数据集并使用torchvision库加载它们使…

3月最新!AIGC公司生态地图;开发者实用ChatGPT工具清单;上手必会的SD绘图教程;字幕组全自动化流程大公开 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『光年之外诚邀产品经理加入』古典产品经理的复兴&#xff01; 光年之外创始人王慧文在社交平台发帖&#xff0c;公布联合创始人团队基…

【C语言初阶】循环语句

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;什么是循环&#x1f337;while循环&#x1f337;do while循环&#x1f337;for循环&#x1f337;循环结构中的break与continue&#x1f33a;break&#x1f33a;continue&#x1f337;goto语句&#x1f490;专栏…

5G将在五方面彻底改变制造业

想象一下这样一个未来&#xff0c;智能机器人通过在工厂车间重新配置自己&#xff0c;从多条生产线上组装产品。安全无人机处理着从监视入侵者到确认员工停车等繁琐的任务。自动驾驶汽车不仅可以在建筑物之间运输零部件&#xff0c;还可以在全国各地运输。工厂检查可以在千里之…

java基于SSH框架的超市管理系统mvc

目 录 1、引言 4 1.1 研究现状 4 1.2 主要研究的目的及内容 5 1.3 研究方法及设计思路 5 1.3.1 研究方法 5 1.3.2 设计思路 6 2、应用需求分析与可行性分析 6 2.1 应用需求分析 7 2.2 运行需求分析 8 2.3 其他需求分析 8 2.4 可行性分析 8 2.…

SpringBoot实战(十三)集成 Admin

目录一、简介二、搭建 springboot-admin 管理服务1.Maven 依赖2.application.yml3.添加 EnableAdminServer4.启动服务&#xff0c;查看页面三、搭建 springboot-admin-client 客户端服务1.Maven 依赖2.application.yml3.启动服务&#xff0c;查看页面四、搭配 Eureka 使用1.搭建…

二叉树的顺序存储与手撕数据结构—堆

TIPS树的话是一种非线性的数据结构&#xff0c;他实际上就是具有一定层次关系的数据集合&#xff0c;并且在树形结构当中&#xff0c;子树之间不能有任何的交集&#xff0c;否则就不是树形结构。然后对于树而言的话&#xff0c;在实际应用当中并不是特别多&#xff0c;在实际应…

Linux防火墙——SNAT、DNAT

目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条件 1、临时打开 2、永久打开 3、SNAT转换1&#xff1a;固定的公网IP地址 4、SNAT转换2&#xff1a;非固定的公网IP地址&#xff08;共享动态IP地址&#xff09; 二、SNAT实验 配置web服务…

力扣-银行账户概要 II

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1587. 银行账户概要 II二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果前言 …