Codeforces Round #731 (Div. 3)

https://codeforces.com/contest/1547/problem/A

A题大致题意为给你三个点,起点终点阻隔点,求起点到终点的最短路径。

计算两点距离,如果三个点在一个直线而且阻隔点在起终点之间,则绕一小段路,即答案+2

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int t,sx,sy,tx,ty,fx,fy;
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		int cnt=0;
		cin>>sx>>sy;
		cin>>tx>>ty;
		cin>>fx>>fy;
		if(sx==tx)
		{
			if(fx==sx&&fy<max(sy,ty)&&fy>min(sy,ty))
			{
				cnt+=2;
			}
		}
		else if(sy==ty)
		{
			if(fy==sy&&fx<max(sx,tx)&&fx>min(sx,tx))
			{
				cnt+=2;
			}
		}
		cnt+=abs(sx-tx);
		cnt+=abs(sy-ty);
		cout<<cnt<<endl;
	}
	return 0;
}

https://codeforces.com/contest/1547/problem/B

B题

给你一个字符串,只包含26个字母中的一部分。

问你这个字符串能否由一个空字符串在左边或者右边按顺序添加字母得到。

思路是先找到a的位置,然后用两个指针分别向左右动,如果最终移动次数和字符串长度相同,则可以做到,如果在任何一个过程找不到与之匹配的字母,则退出循环输出“NO”。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int t; char str[10005];
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		cin>>str+1;
		int a=0,len=strlen(str+1),b=0;
		for(int i=1;i<=len;i++)
		{
			if(str[i]=='a')
			a=i,b=i;//sb错误,这里打成了分号导致a,b不一致,卡了我一个小时.. 
		}
		if(a==0)
		{
			cout<<"NO"<<endl;
			continue;
		}
		//cout<<a<<' '<<b<<endl;
		for(int i=1;i<len;i++)
		{
			if(str[a-1]=='a'+i)a--;
			else if(str[b+1]=='a'+i)b++;
			else 
			{
				//cout<<i<<' '<<a<<' '<<b<<' '<<(char)('a'+i)<<' '<<endl;
				
				cout<<"NO"<<endl;
				goto end;
			}
		}
		cout<<"YES"<<endl;
		end:;
	}
	return 0;
}

https://codeforces.com/contest/1547/problem/C

c题,这题读题卡了我好久..

题意是a和b两个人分别敲代码,修改第某一行的数据或者增加一行,如果第x行没有数据,则无法修改,给你一开始的代码行数和操作数,让你输出一个合适的操作顺序。

简单模拟

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=105;
int t,n,a,b;
int aa[maxn],bb[maxn],ans[maxn*3];
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		cin>>n>>a>>b;
		rep(i,1,a)cin>>aa[i];
		rep(i,1,b)cin>>bb[i];
		int ta=1,tb=1;
		for(int i=1;i<=a+b;i++)
		{
			if(aa[ta]==0&&ta<=a)n++,ans[i]=aa[ta++];
			else if(aa[ta]<=n&&ta<=a)  ans[i]=aa[ta++];
			else if(bb[tb]==0&&tb<=b)n++,ans[i]=bb[tb++];
			else if(bb[tb]<=n&&tb<=b)  ans[i]=bb[tb++];
			else
			{
				cout<<"-1"<<endl;
				goto end;
			}
		}
		for(int i=1;i<=a+b;i++)
		{
			cout<<ans[i]<<' ';
		}cout<<endl;
		end:;
	}
	return 0;
}
//边界判断, 

D.https://codeforces.com/contest/1547/problem/D

给你一串数列a,你要求另一个数列b与他异或“^",使异或后得到的数列c每一项与前一项取和“&”的结果等于后一项本身。

数列b要求最小

把a和a-1取或,得到的数就是数列c,再把数列a和数列b异或即为最小数。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=2e5+5;
ll t,n,a[maxn],c[maxn],ans[maxn];
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		cin>>n;
		rep(i,1,n)cin>>a[i];
		rep(i,2,n)
		{
			c[i]=a[i]|a[i-1];
			ans[i]=a[i]^c[i];
			a[i]=c[i];
		}
		rep(i,1,n)
		{
			cout<<ans[i]<<' ';
		}cout<<endl;
	}
	return 0;
}

E.https://codeforces.com/contest/1547/problem/E

给你n个格子,这些格子里面有n个空调,空调距离每远一格升高一度。求每个格子的温度。

由于对于每个方向,如果a空调能比b空调的温度更低,那么对b空调的右边也应该是a空调的温度更低,所以只需要从左到右和从右到左各枚举一遍,对两个温度取较小值即可

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=3e5+5;
int TT,T,t[maxn],n,a[maxn],k,f[maxn],g[maxn];
int main()
{
	ios
	cin>>TT;
	while(TT--)
	{	
		cin>>n>>k;
		rep(i,1,n)f[i]=1e9+5e8,g[i]=1e9+5e8;
		rep(i,1,k)cin>>a[i];
		rep(i,1,k)
		{
			cin>>t[i];
			f[a[i]]=t[i];
			g[a[i]]=t[i];
		}
		for(int i=1;i<=n;i++)
		{
			if(f[i+1]>f[i]+1)f[i+1]=f[i]+1;
		}
		for(int i=n;i>=1;i--)
		{
			if(g[i-1]>g[i]+1)g[i-1]=g[i]+1;
		}
		for(int i=1;i<=n;i++)
		{
			f[i]=min(f[i],g[i]);
			cout<<f[i]<<' ';
		}
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值