Educational Codeforces Round 139 (Rated for Div. 2)

题目链接

A 直接计算 即可 位数为k 首位数为 a 则 ans=a+(k1)×9

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
int main(){
	int t;
	cin >> t;
	while(t--){
		int n;
		cin >> n;
		int k = 0, tmp = n;
		while(tmp >= 10){
			k++;
			tmp /= 10;
		}
		cout << k * 9 + tmp << "\n";
	}
}

---------------------------------------我是一条美丽的分割线

B 关键在于读题,相邻两个字母构成的单词 有重复 且不是 三连hhh这种即可

写法的话我赛场直接写了个26进制hash,但实际上二维的数组记录即可。

写挂了一发是因为memset写错了。。。。。。。。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f;
int main(){
	int t;
	cin >> t;
	while(t--){
		bool f[30];
		memset(f, 0, sizeof f);
		int n;
		cin >> n;
		string s;
		cin >> s;
		map<int, int> mp1, mp2;
		for (int i = 0; i < n - 1; i++){
			int hash_val = (s[i] - 'a') * 26 + (s[i + 1] - 'a');
			if(i && s[i - 1] == s[i] && s[i] == s[i + 1] && !f[s[i - 1] - 'a']){
				f[s[i - 1] - 'a'] = 1;
			}
			else mp1[hash_val]++;
		}
		bool ok = 0;
		for (auto &x: mp1){
			if(x.second > 1)ok = 1;
		}
		if(ok)puts("YES");
		else puts("NO");
	}
}

---------------------------------------我是一条美丽的分割线

C 水题,直接模拟即可。调了一会的原因是因为 数组开反了。。。。。。编辑器真的不舒服

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f;
int R, n;
char s[3][maxn];
bool check(int nx, int ny, int fr){
	bool ok = 1;
	while(ny < n){
		//cout << nx << ny << endl;
		if(fr == 3){
			if(s[3 - nx][ny] == 'B') {
				if(R <= nx){
					break;
				}
				nx = 3 - nx, fr = nx;
			}
			else {
				if(s[nx][ny + 1] != 'B'){
					ok = 0;
					break;
				}
				else ny++, fr = 3;
			}
		}
		else {
			if(s[nx][ny + 1] != 'B'){
				ok = 0;
				break;
			}
			else ny++, fr = 3;
		}
	}
	return ok;
}
int main(){
	int t;
	cin >> t;
	while(t--){
		cin >> n;
		for (int i = 1; i <= 2; i++){
			for (int j = 1; j <= n; j++){
				cin >> s[i][j];
			}
		}
		R = n + 1;
		for (int j = n; j >= 1; j--){
			if(s[1][j] == 'B' && s[2][j] == 'B')R = j;
			else break;
		}
		bool ok = 0;
		if(s[1][1] == 'B')ok |= check(1, 1, 3);
		if(s[2][1] == 'B')ok |= check(2, 1, 3);
		if(ok)cout << "YES\n";
		else cout << "NO\n";
	}
}

---------------------------------------我是一条美丽的分割线

D 这个感觉也很水
设x是大的那个数,y是小的。
给x-y做一个因式分解,把这个数扩到比x,y的大情况,取最小值就可以了。
赛时T了两发是因为 没开同步(貌似第一发没算复杂度直接交了个根号n的做法。)
实际上这样预处理找因数并不优秀,可以每次优先找自己的最小因数,然后一直除就可以了。
然后卡着时限过了也是过。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 5;
bool isprime[maxn];
int prime[maxn];
int get_primes(int n)
{
    memset(isprime,1,sizeof(isprime));
	int tot = 0;
	for (int i = 2; i <= n; i++)
	{
		if (isprime[i]) prime[tot++] = i;
		for (int j = 0; prime[j] <= n / i; j++)
			//判断条件解释:我们用primes[j]筛掉合数primes[j] * i,只用筛掉小于n的合数就可以了
		{
			isprime[prime[j] * i] = 0;
			if (i % prime[j] == 0) break;
		}
	}
	return tot;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	int nummmm = sqrt(1e7);
	int tot = get_primes(nummmm + 1);
	while(t--){
		int x, y;
		cin >> x >> y;
		if(x < y)swap(x, y);
		if(x - y == 1) cout << -1 << endl;
		else if(x == y) cout << 0 << endl;
		else {
			int ans = 0x3f3f3f3f;
			int num = x - y;
			for (int i = 0; i < tot && prime[i] < num; i++){
				if((x - y) % prime[i])continue;
				while(num % prime[i] == 0)num /= prime[i];
				int k = y / prime[i] * prime[i];
				while(k < y)k += prime[i];
				ans = min(ans, k - y);
				k = x / prime[i] * prime[i];
				while(k < x)k += prime[i];
				ans = min(ans, k - x);
			}
			if(num > 1){
				int k = y/num * num;
				while(k < y) k += num;
				ans = min(k - y, ans);
				k = x / num * num;
				while(k < x) k += num;
				ans = min(k - x, ans);
			}
			cout << ans << endl;
		}
	}
	return 0;
}

posted @   浪释归衣  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示