题目网址
B - Chessboard
题目大意
有一个八行八列的棋盘,行编号为 1,2,3,4,5,6,7,8,列编号为 a,b,c,d,e,f,g,h。棋盘的每个格子都由此唯一编号 如:(从下往上数的第三行第四列为 d3)。
给定一个仅有 . 与 * 构成的八行八列的字符画,保证 * 只有一个。输出这个 * 的位置编号。
解题思路
边输入边判断,遇到*就输出位置编号
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
for(int i = 8; i >= 1; i--) {//用i枚举要输出的行坐标
for(char j = 'a'; j <= 'h'; j++){//用j枚举要输出的列坐标
char x;
cin >> x;
if(x=='*'){
cout << j << i;
return 0;
}
}
}
return 0;
}
C - Gap Existence
题目大意
给定包含 N 个数的序列 A(A1∼AN),求是否存在 1≤i,j≤N 使得 Ai−Aj=X
2 ≤ N ≤ 2×105
109 ≤ Ai,X ≤ 109
解题思路
输入一个存一个,再反向思维在set中用count()寻找可以使ai变成x的数
代码
#include<bits/stdc++.h>
using namespace std;
int n, x;
int a[200005];
set<int> s;
int main()
{
cin >> n >> x;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= n; i++)
{
if (s.count(a[i] + x)|| s.count(a[i] - x))//寻找set变量中有无可以让a[i]变成x的数
{
cout << "Yes";
return 0;
}
}
cout << "No";
return 0;
}
D - M<=ab
题目大意
给定正整数 N 与 M,求满足下列条件的最小的 X,如果不存在则输出 −1:
- X 可以写作 a×b,并且 1≤a,b≤N,允许 a=b。
- X≥M
数据范围:
1≤N,M≤1012 .
解题思路
先枚举a的值,再有a去求出b(b等于m/a向上取整)。
但是还是超时,运行程序时输出a,b可以看出,在a≥b之后,就有重复的了,所以可以在a≥b时退出循环。
拓展:
- 四舍五入:round()函数
- 向上取整:ceil()函数
- 向下取整:floor()函数
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, ans;
signed main() {
cin >> n >> m;
int minn = LLONG_MAX;
for (int a = 1; a <= n; a++)
{
int b = ceil(m/a); // m/a 上取整
if (b <= n)//满足条件
{
minn = min(minn, a * b);//取最小值
}
if (a > b) // 重复么枚举,退出循环 ,不如会超时
break;
}
if(minn == LLONG_MAX) cout << -1;//没有满足条件的b值
else cout << minn << "\n";
return 0;
}