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;
}