★传送门
第一题:给定字符串,判断开头是否“YAKI”
# include <iostream>
# include <cstdio>
using namespace std;
int main()
{
string s;
cin >> s;
cout << (s.substr(0, 4) == "YAKI"?"Yes":"No") <<endl;
return 0;
}
第二题:给定N*M的矩阵,初始全为白色,每次操作可以将某一行或者某一列的颜色反转,为是否能操作得到刚好有K个黑色。
- 1≤N,M≤1000
- 0≤K≤NM
# include <iostream>
# include <cstdio>
using namespace std;
int main()
{
int x, y, k;
scanf("%d%d%d",&x,&y,&k);
for(int i=0; i<=x; ++i)
for(int j=0; j<=y; ++j)
if(i*y+j*x-i*j*2 == k) return 0*puts("Yes");
puts("No");
return 0;
}
第三题:给定N*M字母矩阵,问是否能通过任意改变字母的顺序,使得矩阵每一行每一列都是回文串。
- 1≤H,W≤100
- aij is a lowercase English letter.
# include <iostream>
# include <cstdio>
using namespace std;
int a[26];
int main()
{
char c;
int n, m, x=0, y=0, g=0, gg=0;
scanf("%d%d",&n,&m);
gg = (n/2)*(m/2);
for(int i=0; i<n; ++i)
{
getchar();
for(int j=0; j<m; ++j)
{
scanf("%c",&c);
++a[c-'a'];
}
}
for(int i=0; i<26; ++i)
{
if(a[i]&1)
{
++x;
--a[i];
}
int tmp = min(gg, a[i]/4);
gg -= tmp;
a[i] -= tmp*4;
if(a[i]) y+=a[i]/2;
}
if((!(n&1) && !(n&1) && x) || x > 1) return 0*puts("No");
if(n&1) g += m/2;
if(m&1) g += n/2;
if(y <= g) puts("Yes");
else puts("No");
return 0;
}
第四题:给个矩阵上4种颜色,要求曼哈顿距离为D的点对颜色不一样,输出任意一个方案。
- 2≤H,W≤500
- 1≤d≤H+W−2
应用了切比雪夫距离,一个N*N的格子里面切比雪夫距离<N,标程写的比较优雅,直接上标程了。
#include <iostream>
using namespace std;
int main() {
int H, W, d;
cin >> H >> W >> d;
char color[2][2] = {{'R', 'G'}, {'B', 'Y'}};
for (int i = 0; i < H; i++)
{
for (int j = 0; j < W; j++)
{
cout << color[(i+j)/d%2][(i-j+10000)/d%2];
}
cout << endl;
}
return 0;
}