Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)

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

S是他各个位数之和,求从1到给出的n有多少个数有 s+1 < s

签到题,s+1<s只有s的个位数为9有可能。故数量为(n+1)/10

#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,n;
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		cin>>n;
		cout<<(n+1)/10<<endl;
	}
	return 0;
}

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

问对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=1e5+5;
int t,lens,lenl;char strs[maxn],strl[maxn];
inline void solve()
{
	cin>>strl+1;
	cin>>strs+1;
	lenl=strlen(strl+1);lens=strlen(strs+1);
	for(int i=1;i<=lenl;i++)
	{
		if(strl[i]==strs[1])
		{
			int top=1;
			for(int j=i; j<=lenl && top<=lens ;j++,top++)
			{
				if(strl[j]!=strs[top])break;
				for(int k=j,ttop=top; k>=1 &&ttop<=lens;ttop++,k--)
				{
					if(strl[k]!=strs[ttop])
					{
						break;
					}
					if(ttop==lens)
					{
						cout<<"YES"<<endl;
						return;
					}
				}
			}
		}
	}
	cout<<"NO"<<endl;
	return;
}
int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

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

一共射10球,双方轮流射球,1为进,2为不进,?有可能进也有可能不进,问对于给定的射球预言,最少到第几个球就可以确定双方哪边获胜?

模拟题,先假设1全进,再假设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;
const int maxn=15;
int t;char str[maxn];

void solve()
{
	int cnta=0,cntb=0,ans=999,res=999;
	cin>>str+1;
	for(int i=1;i<=10;i++)
	{
		if(i%2)
		{
			if(str[i]=='1'||str[i]=='?')cnta++;
		}
		else
		{
			if(str[i]=='1')cntb++;
		}
		if(cnta-cntb>(10-i+1)/2)
		{
			ans=i;
			res=min(ans,res);
			//cout<<cnta<<' '<<cntb<<' '<<i<<endl;
			break;
		}
	}
	cnta=0;cntb=0;
	for(int i=1;i<=10;i++)
	{
		if(i%2)
		{
			if(str[i]=='1')cnta++;
		}
		else
		{
			if(str[i]=='1'||str[i]=='?')cntb++;
		}
		if(cntb-cnta>(10-i)/2)
		{
			ans=i;
			res=min(ans,res);
			//cout<<cnta<<' '<<cntb<<' '<<i<<endl;
			break;
		}
	}
	if(res==999)cout<<10<<endl;
	else cout<<res<<endl;
}
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

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

给定一个长字符串和一个短字符串,你可以把长串中的任意数量字母替换为退格键(退格键会清除前一个字母)问你是否可以把长字符串通过此操作替换为短字符串

对于此题,容易想到短串的两个字符之间必须要有偶数个字符,但对于第一个字符不是。如何确定第一个字符?

我们可以把字符串倒过来考虑,对倒过来的字符串,最后一个字符后面的字符一定也为偶数个,所以可以确定字符串的结尾是哪个字符(若不满足条件,继续找下一个满足条件的字符)

#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=1e5+5;
int t,lenl,lens;char strs[maxn],strl[maxn];
void solve()
{
	cin>>strl+1;
	cin>>strs+1;
	lenl=strlen(strl+1);lens=strlen(strs+1);
	if(lens>lenl)
	{
		cout<<"NO"<<endl;
		return;
	}
	
	int a=lenl+1,b=lenl+1,dis=0,now=lens;
	while(b!=0)
	{
		//cout<<b<<' '<<strl[b]<<' '<<strl[a]<<' '<<strs[now]<<' '<<"dis"<<dis<<' '<<"now"<<now<<endl;
		if(strl[b]==strs[now])
		{
			dis=a-b-1;
			//cout<<a<<'='<<b<<' '<<strl[b]<<' '<<strl[a]<<' '<<strs[now]<<' '<<"dis"<<dis<<' '<<"now"<<now<<endl;
			if(!(dis%2))
			{
				a=b;now--;
			}
			//cout<<dis<<' '<<b<<' '<<now<<strs[now]<<' '<<strl[]<<endl;
		}
		if(now==0)
		{
			cout<<"YES"<<endl;
			return;
		}
		b--;
	}
	cout<<"NO"<<endl;
	return;
}
int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值