abc297BCD —题解
B - chess960
题目大意
给定一个长度为 8 的字符串,刚好包含 K 与 Q 各一个,R、B 与 N 各两个。判断 S 是否满足下面的条件:
- 假设从左数的第 x 个与第 y 个字符是 B,x<y。那么 x 与 y 有不同的奇偶性。
- K 必须在两个 R 之间。
解题思路
先输入字符串,再进行逐个判断。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
char a[10];
int t = 1;
int x, y, z, sum;
signed main() {
cin >> a+1;
for(int i = 1 ; i <= 8; i++) {
if(a[i] == 'B'){//分别记录两个B的位置
if(t == 1){
t++;
x=i;
}
else {
y=i;
}
}
if(a[i] == 'R') //是R记录个数
sum++;
if(a[i] == 'K' && sum == 1)//判断K是否在一个R的后面
z = 1;
}
if((x + y) % 2 == 1&& z == 1)//判断两个B的位置是否有不同的积偶性和K是否在两个R之间
cout << "Yes";
else
cout << "No";
return 0;
}
C - PC on the Table
题目大意
给定一个 H 行 W 列的二维字符画。只包含字符 . 与 T。
Taka 可以进行下面的步骤任意次(可能零次):
- 选择一个满足 1≤i≤H 且 1≤j≤W−1 的位置位 (i,j) ,如果位置 (i,j) 与位置 (i,j+1) 都是 T,就可以把 位置 (i,j) 改为 P,位置 (i,j+1) 改为 C。
他会尽可能多得做这个步骤,找到一个最多操作次数时可能的最终局面
- 1≤H≤100
- 2≤W≤100
解题思路
挨个枚举,寻找是否有横向连续的两个T存在,如果存在就将前面的改为P,后面的改为C。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
int h, w;
cin>>h>>w;
string s[105];
for(int i = 1; i <= h; i++) cin>>s[i];
for(int i = 1 ; i<= h; i++)
{
for(int j = 0; j <= s[i].length() - 1; j++)
{
if(s[i][j] == 'T' && s[i][j + 1] == 'T')//判断是否是连续的两个T
{
s[i][j] = 'P';
j++;
s[i][j] = 'C';
}
}
}
for(int i = 1; i <= h; i++)
{
cout<<s[i]<<endl;
}
return 0;
}
D - Count Subtractions
题目大意
给定正整数 A 和 B。
你将重复下面操作,直到 A=B:
比较 A 与 B 的大小,并执行下面的一种操作:
- 如果 A>B,那么把 A 变成 A−B
- 如果 A<B,那么把 B 变成 B−A
需要操作多少次。
1≤A,B≤1018
解题思路
A减n次B,n就是A/B,余数就是A%B
所以我们可以用辗转相除来做此题
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int ans;
void zzxc(int a,int b){//辗转相除
if(a == b) return ;
if(a % b != 0){
ans += a / b;
zzxc(b, a%b);
}
else {
ans += a / b - 1;
}
}
signed main() {
int a, b;
cin >> a >> b;
zzxc(a,b);
cout << ans;
return 0;
}