专栏文章

8.17总结

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip3cstl
此快照首次捕获于
2025/12/03 05:29
3 个月前
此快照最后确认于
2025/12/03 05:29
3 个月前
查看原文
T3 思路:分别记录偶数和奇数,然后比较最大的两偶数和与最大的两奇数和,输出较大者
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,a[1000000],b[1000000],x,ar=1,br=1;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		if(x%2==1)//如果是奇数
		{
			b[br++]=x;存入奇数
		}
		else
		a[ar++]=x;//否则存进偶数
	}
    //排序
	sort(a+1,a+ar+1);
	sort(b+1,b+br+1);
	if(ar<3&&br<3)//如果没有两奇数和两偶数
	{
		cout<<-1;//不可能何为偶数
		return 0;
	}
	if(ar<2)//没有两个偶数
	{
		cout<<b[br]+b[br-1];//输出奇数和
		return 0;
	}
	if(br<2)//反之亦然
	{
		cout<<a[ar]+a[ar-1];
		return 0;
	}
	cout<<max(a[ar]+a[ar-1],b[br]+b[br-1]);//不然输出最大者
	return 0;
 }
T4 思路:由于数据过大,所以我们要用搜索,先求出方向数组即可
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k,cnt,u[10001000],v[10010000],vis[1010][1010];
struct node{
	ll x,y;//二维
}; 
void bfs()
{
	queue<node>q;//建队
	q.push({1,1});//入队起点
	vis[1][1]=1;//起点标记(因为不能标0,所以这里相当于将所有的位置的步数加上1,输出时减去1即可)
	while(!q.empty())//如果没空
	{
		node f=q.front();//保存
		q.pop();//出队
		for(int i=1;i<=cnt;i++)//cnt个方向
		{
			ll p=f.x+u[i],qq=f.y+v[i];//走到的
			if(p>=1&&p<=n&&qq>=1&&qq<=n&&vis[p][qq]==0//没出界且没走过)
			{
				vis[p][qq]=vis[f.x][f.y]+1;//用vis存步数
				q.push({p,qq});//将走到的入队
			}
		}
	}
}
int main()
{
	cin>>n>>k;
直接算方向
    for(int i=-1000;i<=1000;i++)
    {
    	for(int j=-1000;j<=1000;j++)
	    {
	    	if(i*i+j*j==k)
	    	{
	    		cnt++;
	    		u[cnt]=i;
	    		v[cnt]=j;
			}
		}
	}
	bfs();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<vis[i][j]-1<<" ";//如果没走过就是0,减一就是-1,符合题意
		}
		cout<<endl;
	}
	return 0;
 }
T5 思路:优化流,所有小于零或大于nn的都不存,就可以省下很多时间和空间
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[1010000],b[1010000];
vector<ll>v[200100];//为了省空间,不然2e5会炸
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		ll j=1;
		if(a[i]<0)
		{
			j=-a[i]/i;//把j的初始值先算好
		}
		for(;a[i]+j*i<=n&&j<=m;j++)可以不定义
		{
			if(a[i]+j*i>=0)
			{
				v[j].push_back(a[i]+j*i);
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		sort(v[i].begin(),v[i].end());
		ll ans=0,f=0;
		for(auto x: v[i])//查找v[i]({....})
		{
			if(x<ans)
			{
				continue;
			}
			if(ans!=x)
			{
				f=1;
				cout<<ans<<endl;
				break;
			}
			else
			ans++;
		}
		if(!f)
		{
			cout<<ans<<endl;//没有输出过
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...