寒训1.11记录

AtCoder Beginner Contest 272 - AtCoder

A-Integer Sum (赛#

题目概述#

求和

B-Everyone is Friends (赛#

题目概述#

二维数组记录相互关系即可,数据量少可用O(n3)

C-Max Even (赛#

题目概述#

从非负整数数列中找出和为偶数,且和最大的两个数

解题思路#

遍历数列,把偶数和奇数放入两个向量,排序后求最大两个再比大小

D-Root M Leaper (赛-补#

题目概述#

NN棋盘,每步可以走长度 M到达一个整格

求解到达每个位置的最短路径

解题思路#

最短路径可以用bfs

(1) 1e6求出?2+?2=M

(2) 利用re[N][N]记录是否走过,利用dx[4]=1,1,1,1,dy[4]=1,1,1,1 遍历整个棋盘

注意:在同一层循环中,如果其中一个方向的位移为零,就可能出现在队列中加入完全相同的两个节点,不断迭代就会产生极大的时间浪费,因而我们需要记录(i,j)是否已进入队列或者特判这种情况!!

完整代码#

#include<bits/stdc++.h>
using namespace std;
const int N=410,M=1e6+10; 
int map1[N][N],re[N][N];
vector<int> x,y;
int dx[4]={1,1,-1,-1},dy[4]={1,-1,1,-1};
struct node{
	int x,y,step;
};
int main()
{
    #记得赋初值
	memset(map1,-1,sizeof map1);
	memset(re,0,sizeof re);
	x.clear(),y.clear();
	int n,m;
	cin>>n>>m;
	for(int i=0;i*i<=m;i++)
	{
		for(int j=0;j*j<=m;j++)
		{
			if(i*i+j*j==m)
			{
				x.push_back(i);
				y.push_back(j);
				x.push_back(j);
				y.push_back(i);
			}
		}
	}
	queue<node> q;
	node a,next,now;
    #记得赋初值
	map1[1][1]=0;
	re[1][1]=1;
	a.x=1,a.y=1,a.step=0;
	q.push(a);
	while(!q.empty())
	{
		now=q.front();
		q.pop();
		for(int i=0;i<x.size();i++)
		{
			for(int j=0;j<4;j++)
			{
				next.x=now.x+dx[j]*x[i];
				next.y=now.y+dy[j]*y[i];
				next.step=now.step+1;
				if(next.x>=1&&next.y>=1&&next.x<=n&&next.y<=n)
				{
					if(re[next.x][next.y]==0)
					{
						re[next.x][next.y]=1;
						map1[next.x][next.y]=next.step;
						q.push(next);
					}
				}
			}
		} 
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<map1[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

E-Add and Mex (补#

参考ABC 272E - Add and Mex(MEX,调和级数)-CSDN博客

题目概述#

有一长度为N的整数数列A=(A1,A2,...,AN),对AM次操作,一次操作为对每个Aii,求出每次操作后序列中未出现的最小非负整数

解题思路#

(1) 一个长度为n的数列,未出现的最小非负整数只可能在[0,n]范围内,因而只有处在该区间的数字会对结果产生影响可以使用一个set容器r[j]对第j次操作后在该范围内的数字进行记录

(2) 时间复杂度分析:

由于序列每次增iinsert只会进行大约N+N/2+N/3+...+N/M N(1+1/2+1/3+...+1/M) N(logM) 次,时间复杂度为O(NlogM)

而寻找Mex的过程中Mex始终较小(因为每次都加上i,就算有一个询问中出现了0n,加过之后下一个询问就没有了,所以一个询问中能从0开始连续的数字长度其实是很小的,那么直接从0开始枚举看哪个数不存在即可。)

完整代码#

#include<bits/stdc++.h>
using namespace std;
const int N=2*1e5+10;
const int M=2*1e6;
set<int> r[N];
int main()
{
	int a,n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a;
		if(a<n&&a+m*n>=0)
		{
			int j;
			if(a>=0)
			{
				j=1;
			}
			else
			{
				if((-a)%i==0) j=(-a)/i;
				else j=(-a)/i+1;
			}
			a=a+j*i;
			while(a<=n&&j<=m)
			{
				r[j].insert(a);
				j++;
				a+=i;
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=0;j<=n;j++)
		{
			if(!r[i].count(j))
			{
				cout<<j<<endl;
				break;
			}
		}
	}	
	return 0;
}

F-Two Strings (待补#

题目概述#

解题思路#

G-Yet Another mod M (待补#

题目概述#

解题思路#

H-Flipping Coins 2 (待补#

题目概述#

解题思路#

作者:cyxcc

出处:https://www.cnblogs.com/cyxcc/p/17973605

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

You learn to take life as it comes at you.

posted @   cyxcc  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示