ABC296 BCD 题解 -liuyanghao

liuyanghao2009 2023-07-08 13:50:09 6

我从这里抄的

题目网址

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(A~1~∼A~N~),求是否存在 1≤i,j≤N 使得 A~i~−A~j~=X 2 ≤ N ≤ 2×10^5^ 10^9^ ≤ A~i~,X ≤ 10^9^


解题思路

输入一个存一个,再反向思维在set中用count()寻找可以使a~i~变成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≤10^12^ .


解题思路

先枚举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;
}
{{ vote && vote.total.up }}