【CF补题】【ABC】Codeforces Round #777 (Div. 2) C++代码

 A. Madoka and Math Dad

【题意】求连续不带零且不相等位数的最大十进制数,使其位数之和为 n。有t个测试n

【思考】根据样例我们就可以推测答案是121212...或212121....

n%3=1时,答案是12..121

n%3=2时,答案是21..212

n%3=0时,答案是21..21

#include<bits/stdc++.h>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t;
	cin >> t;
	int n;
	while (t--)
	{
		cin >> n;
		int cnt = n / 3;
		int p = n % 3;
		if (p == 1)
		{
			for (int i = 1; i <= cnt; i++)
				cout << 12;
			cout << 1;
		}
		if (p == 2)
		{
			for (int i = 1; i <= cnt; i++)
				cout << 21;
			cout << 2;
		}
		if (p == 0)
		{
			for (int i = 1; i <= cnt; i++)
				cout << 21;
		}
		cout << '\n';
	}
	return 0;
}

——————————————————————————————————————————

B. Madoka and the Elegant Gift

【题目】B. Madoka and the Elegant Gift

【思路】数据量比较小可以直接暴力

如果一个点纵向构成有长方体,横向也有,那么这张图就是不elegant的。

换句话说,出现L型就是no。

再换句话说,田字格中出现且仅出现3个1时就是no。

#include<bits/stdc++.h>
using namespace std;
int n, m;
int mp[111][111];
bool check(int i, int j)
{
	if (mp[i][j] + mp[i + 1][j] + mp[i][j + 1] + mp[i + 1][j + 1] == 3) return 1;
	/*if (mp[x - 1][y] && mp[x][y - 1] && (mp[x - 1][y - 1] == 0))return 1;
	if (mp[x - 1][y] && mp[x][y + 1] && (mp[x - 1][y + 1] == 0))return 1;
	if (mp[x + 1][y] && mp[x][y - 1] && (mp[x + 1][y - 1] == 0))return 1;
	if (mp[x + 1][y] && mp[x][y + 1] && (mp[x + 1][y + 1] == 0))return 1;*/
	return 0;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		memset(mp, 0, sizeof(mp));
		bool flag = 0;
		cin >> n >> m;
		char c;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				cin >> c;
				mp[i][j] = c - '0';
			}
		}
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
				if (flag==0) {
					if (check(i, j))
					{
						//cout << "ans=  ";
						cout << "NO" << '\n';
						flag = 1;
						break;
					}
				}
		}
		//cout << "ans=  ";
		if (flag == 0)cout << "YES" << '\n';
	}
	return 0;
}

C. Madoka and Childish Pranks

【题目】大概题意是,原本有n ∗ m的网格,然后每次操作只能按棋盘图案操作,就是只能画一个类似棋盘的图案,问是否能画出她想要的东西。

【思考】注意到这句话“请注意,您不需要尽量减少操作次数”,那么我们显然选择最小的画法,也就是涂1格或者2格---1格就是0,2格就是01.

所以2个格子中,00,01是可以的,而10是不能实现的,也就是说,只要第一个格子是黑色的就输出-1,其他的颜色都是可以实现的,需要模拟一下,模拟的方式就是从右下角往上推

!!!!然后,非常悲伤的一点是,如果直接赋值语句,在第5个点会re

我一开始是这么写的:        an[cnt][1] = i - 1;
                                            an[cnt][2] = j;
                                            an[cnt][3] = i;
                                            an[cnt][4] = j;

所以我们可以用更快的push_back

#include<bits/stdc++.h>
using namespace std;
int n, m;
int mp[111][111];
long long cnt;
vector<array<int, 4> >ans;//二维答案数组
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		memset(mp, 0, sizeof(mp));
		cnt = 0;
		cin >> n >> m;
		char c;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				cin >> c;
				mp[i][j] = c - '0';
			}
		}
		if (mp[1][1] == 1)
		{
			cout << -1 << '\n';
			continue;
		}

		for (int i = n; i >= 1; i--)
		{
			for (int j = m; j >= 1; j--)
			{
				if (mp[i][j] == 1)
				{
					if (j == 1)
					{
						ans.push_back({ i - 1,j,i,j });
					}
					else
					{
						ans.push_back({ i,j - 1,i,j });
					}
				}
			}
		}
		cout << ans.size() << "\n";
		for (auto i : ans) {
			cout << i[0] << ' ' << i[1] << ' ' << i[2] << ' ' << i[3] << endl;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值