AtCoder Beginner Contest 296 (A~D)
A. Alternately
题意:
给定一个长度为 n n n 的只包含 两种 字符的字符串。
判断这个字符串中的字符是否都是交替放置的。
思路:
枚举判断。
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
string s;
int main()
{
cin >> n;
cin >> s;
int f = 1;
for (int i = 1; i < n; i++){
if (s[i] == s[i - 1])
f = 0;
}
if (f) puts("Yes");
else puts("No");
return 0;
}
B. Chessboard
题意:
给定一个 8 × 8
的网格,规定行号 从下往上 依次是 a、b、c...h
,列号 从左往右 依次是 1、2、3...8
。
要求找个一个字符 *
,输出其坐标。
思路:
枚举。
代码:
#include <bits/stdc++.h>
using namespace std;
string s[10];
int main()
{
char r;
int c;
for (int i = 0; i < 8; i++){
cin >> s[i];
for (int j = 0; j < 8; j++){
if (s[i][j] == '*'){
r = j + 'a';
c = 8 - i;
}
}
}
cout << r << c << endl;
return 0;
}
C. Gap Existence
题意:
给定一个长度为 n n n 的整数序列和 x x x ,要求在序列中找到两个数 a 、 b a、b a、b ,满足 a − b = x a - b = x a−b=x .
思路:
将给定的元素都用 set
存储,依次枚举 b
,则要找的 a = b + x
,判断 set
中是否存在满足条件的 a
即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m;
set<int> S;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++){
int x;
cin >> x;
S.insert(x);
}
for (auto x : S){
if (S.count(x + m)){
puts("Yes");
return 0;
}
}
puts("No");
return 0;
}
D. M<=ab
题意:
给定两个整数
n
n
n 和
m
m
m ,要求在 1 ~ n
中找到两个数
a
、
b
a、b
a、b ,使得在满足
a
×
b
≥
m
a×b \ge m
a×b≥m 的条件下,同时
a
×
b
a × b
a×b 最小。
思路:
a a a 和 b b b 可能是同一个数,也可能一大一小。
我们可以假设 a ≤ b a \le b a≤b ,枚举 a a a 从 1 ~ n,设 b = ⌈ m a ⌉ b = \lceil \frac{m}{a} \rceil b=⌈am⌉ ,每次更新 a × b a × b a×b 的最小值。
同时要保证前提 a ≤ b a \le b a≤b ,当 a > b a > b a>b 时退出循环,可以知道 a a a 最多枚举 m + 1 \sqrt{m} + 1 m+1 次。
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, m;
int main()
{
cin >> n >> m;
ll res = 2e18;
for (ll i = 1; i <= n; i++){
ll x = (m + i - 1) / i;
if (x <= n) res = min(res, i * x);
if (i > x) break;
}
if (res == 2e18) cout << -1 << endl;
else cout << res << endl;
return 0;
}