Educational Codeforces Round 51 Editorial

Educational Codeforces Round 51 Editorial

A. Vasya And Password

题意:枚举各种情况。

#include<string>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<cctype>

#define rep(a,b) for(register int i=a;i<=b;i++)
#define red(a,b) for(register int i=a;i>=b;i--)
#define unsigned long long ULL 
#define long long LL 
using namespace std;

string s;
string t;
int cnt[4];
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		cin >> s;
		t = s;
		memset(cnt, 0, sizeof(cnt));
		int pre;
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] <= 'z'&&s[i] >= 'a')t[i] = '1', cnt[1]++;
			if (s[i] <= 'Z'&&s[i] >= 'A')t[i] = '2', cnt[2]++;
			if (s[i] <= '9'&&s[i] >= '0')t[i] = '3', cnt[3]++;
		}
			if (cnt[1] && cnt[2] && cnt[3])cout << s <<endl;
			else
			{
				if (cnt[1] && cnt[2])
				{
					pre = cnt[1] > cnt[2] ? 1 : 2;
					for (int i = 0; i < t.size(); i++)
					{
						if (t[i] - '0' == pre)
						{
							s[i] = '0';
							break;
						}
					}
				}
				else if (cnt[2] && cnt[3])
				{
					pre = cnt[2] > cnt[3] ? 2 : 3;
					for (int i = 0; i < t.size(); i++)
					{
						if (t[i] - '0' == pre)
						{
							s[i] = 'a';
							break;
						}
					}
				}
				else if (cnt[1] && cnt[3])
				{
					pre = cnt[1] > cnt[3] ? 1 : 3;
					for (int i = 0; i < t.size(); i++)
					{
						if (t[i] - '0' == pre)
						{
							s[i] = 'A';
							break;
						}
					}
				}
				else
				{
					if (cnt[1])
					{
						s[0] = 'A';
						s[1] = '0';
					}
					if (cnt[2])
					{
						s[0] = 'a';
						s[1] = '0';
					}
					if (cnt[3])
					{
						s[0] = 'a';
						s[1] = 'A';
					}
				}
				cout << s<<endl;
			}
	}
	//system("pause");
}

B. Relatively Prime Pairs

题意:找2n范围内的n对互质数,相邻互质

int main()
{
	LL l, r;
	cin >> l >> r;
        cout<<"YES"<<endl;
	for (LL i = l; i <= r; i+=2)
	{
		cout << i << " " << i + 1 << endl;
	}
	//system("pasue");
}

C. Vasya and Multisets

题意:把序列分成两半,两边出现单次的数的数量相同。

模拟即可。

计算出初始出现次数,出现1次的如果是偶数直接各取一半。

出现2次的完全不影响(可以分成一边一个)

出现2次以上的可以分出一个只影响一边。

判断:出现1次为奇数:是否能通过出现2次以上的去影响。

int main()
{
	memset(B, 0, sizeof(B));
	int n;
	cin >> n;
	rep(1, n)
	{
		cin >> A[i];
		B[A[i]]++;
	}
    int pre=0;
	rep(1, n)
	{
		if (B[A[i]] == 1)
		{
			v1.push_back(i);
		}
		else if(B[A[i]]>2)
		{
			v2.push_back(i);
		}
	}

	if (v1.size() % 2 && v2.size() == 0)
	{
		cout << "NO" << endl;
	}
	else
	{
		int cnt = 1;
		if (v1.size() % 2 == 0)
		{
			for (int a : v1)
			{
				if (cnt <= v1.size() / 2)
				{
					ans1.push_back(a);
					cnt++;
				}
				else ans2.push_back(a);
			}
		}
		else
		{
			for (int a : v1)
			{
				if (cnt <= v1.size() / 2)
				{
					ans1.push_back(a);
					cnt++;
				}
				else ans2.push_back(a);
			}
			pre = v2[0];
		}
		for (int a : ans1)
		{
			res[a] = 'A';
		}
		for (int b : ans2)
		{
			res[b] = 'B';
		}
		for (int i = 1; i <= n; i++)
		{
			if (B[A[i]] > 1)
			{
				res[i] = 'B';
			}
		}
		if (pre)res[pre] = 'A';
		res[n + 1] = '\0';
		cout << "YES" << endl;
		cout << res+1 << endl;
	}
	//system("pause");
}

D. Bicolorings

题意:

递推DP,判断4种情况对4种情况的影响,一列一列递推过去。

0、1、2、3分别对应无色,上一色,下一色,双色。

因为只有两行直接可以枚举出来

#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
#include<vector>
#include<set>
#include<cctype>

#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)

#define ULL unsigned long long
#define LL long long
#define MOD 998244353
using namespace std;

LL dp[1100][2500][4];

void init()
{
	memset(dp, 0, sizeof(dp));
	dp[1][1][0] = 1;
	dp[1][1][3] = 1;
	dp[1][2][1] = 1;
	dp[1][2][2] = 1;
}
int main()
{
	int k, n;
	cin >> n >> k;
	init();
	
	rep(i, 2, n)
	{
		rep(j, 1, k)
		{
			dp[i][j + 1][0] = (dp[i - 1][j][3]+dp[i][j+1][0])%MOD;
			dp[i][j + 2][1] = (dp[i - 1][j][2]+dp[i][j+2][1])%MOD;
			dp[i][j + 1][1] = (dp[i][j+1][1]+dp[i - 1][j][0] + dp[i - 1][j][3])%MOD;
			dp[i][j + 2][2] = (dp[i - 1][j][1]+dp[i][j+2][2])%MOD;
			dp[i][j + 1][2] = (dp[i - 1][j][0] + dp[i - 1][j][3]+dp[i][j+1][2])%MOD;
			dp[i][j + 1][3] = (dp[i][j+1][3]+dp[i - 1][j][0])%MOD;
			dp[i][j][0] = (dp[i][j][0] + dp[i - 1][j][0] + dp[i - 1][j][1] + dp[i - 1][j][2])%MOD;
			dp[i][j][1] = (dp[i][j][1]+dp[i - 1][j][1])%MOD;
			dp[i][j][2] = (dp[i][j][2]+dp[i - 1][j][2])%MOD;
			dp[i][j][3] = (dp[i - 1][j][3] + dp[i - 1][j][1] + dp[i - 1][j][2]+dp[i][j][3])%MOD;
			/*
			cout << j << ":" << endl;
			cout << dp[i][j][0] << endl;
			cout << dp[i][j][1] << endl;
			cout << dp[i][j][2] << endl;
			cout << dp[i][j][3] << endl;
			cout << endl;
			*/
		}
	}

	cout << (dp[n][k][0] + dp[n][k][1] + dp[n][k][2] + dp[n][k][3])%MOD << endl;
	//system("pause");
}

猜你喜欢

转载自blog.csdn.net/mxYlulu/article/details/82817564