首页 > 其他分享 >Educational Codeforces Round 139 (Rated for Div. 2)

Educational Codeforces Round 139 (Rated for Div. 2)

时间:2022-12-13 17:56:19浏览次数:71  
标签:Educational Rated ok int Codeforces cin while maxn const

题目链接

A 直接计算 即可 位数为k 首位数为 a 则 \(ans = a + (k - 1) \times 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;
}

标签:Educational,Rated,ok,int,Codeforces,cin,while,maxn,const
From: https://www.cnblogs.com/molarsu/p/16979477.html

相关文章

  • CMYK separated images
    BOOLfipImage::splitCMYK(fipImage&newc,fipImage&newm,fipImage&newy,fipImage&newk){if(_dib){if(!FreeImage_HasPixels(_dib))returnFALSE;//src......
  • codeforces 598 div3 Minimize the Permutation(贪心找规律)
    题目大意:有n个排列数。现在定义操作:交换第i和i+1个元素。我们对每个i位置只能操作一次。问经过这种操作后,我们最少能够得到的字典序序列是多少。解题思路:我们贪心从小到大选......
  • codeforces ECR 74 Standard Free2play(找规律)
    题目大意:有一座山,山有h层。每一层都有平台。有些平台凸出来,有些平台是凹进去。主角一开始站在h层平台,他的目标是落到第0层。主角能够下山的方式只有一种:让高为x的平台和高为......
  • codeforces 596 div2 p-binary(数位复杂度压缩)
    题目大意:已知: 同时  ,问k最少为多少。解题思路:首先,我们看到这里有2的n次方,我们考虑能不能从二进制表示下手,我们通过移位来表示:得到公式 ,很直接的想法是我们让k从小到大......
  • codeforces 594 div2 Ivan the Fool and the Probability Theory (DP 推公式)
    题目大意:现在有n*m个格子。然后我们可以对这些格子染上黑色或者白色。规定每个格子最多允许相邻1个与它同样颜色的格子,问你我们有多少中不同的染色方案。解题思路:首先考虑1*......
  • codeforces 1354D - Multiset (线段树或者2分)
    题目大意:已知一个数列an,我们每次可以添加一个数k,或者把第k大的数字去掉。问我们经过k次操作后,数列中任意1个剩余的数字。n,q<=1e6解题思路:首先最简单的思路是线段树。线段......
  • Codeforces Round #837 (Div. 2)D (最大回文字串+树)
    题目链接:D.Hossamand(sub-)palindromictree题目描述给定一颗有n(n<=2e3)个顶点的树,每个顶点有一个点权(字符),定义s(u,v)为从u到v的简单路径所经过的点权形成的字符......
  • Codeforces Round #837 (Div. 2)补题
    CodeforcesRound#837(Div.2)A.HossamandCombinatorics知识点:简单题复杂度:\(O(nlogn)\)很明显能看出,该题与数据的位置无关,只与大小有关所以我们可直接排序,判断......
  • 题解 CodeForces 940E Cashback
    1.题面描述题目链接给定长为\(n\)的序列和一个整数\(c\),你需要将其分为若干段。对于每一段,若其长度为\(k\),则可以删除其中前\(\lfloor\frac{k}{c}\rfloor\)小的......
  • Codeforces Round #821 (Div. 2)
    比赛链接A题意:给定一个长度为n的数组,你可以任意交换两个距离为k的数,求最大的连续k个数组之和。核心思路:这个我们直接暴力就好了,我们可以把那些距离为k的比较大的全都换......