ABC298 BCD 题解 - 陈思远 x07ckY

chensiyuan 2023-07-24 22:28:49 2023-07-25 21:34:28 10


修正了标题和部分错别字

学业沉重,不过现在有时间了

B: Trick Taking 接受诡计

题意描述

给你两个数组 两两一对 以及它们的长度 , 一个基准值 . 如果 里没有 则使用 的第一位作为基准值.

现在查找一对在 为基准值中 最大的一对, 输出这一对的编号.

代码

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, t;
	vector<int> c, r;

	cin >> n >> t;
	c.resize(n);
	r.resize(n);
	for (auto& item : c) {
		cin >> item;
	}
	for (auto& item : r) {
		cin >> item;
	}

	bool find = false;
	for (auto item : c) {
		if (item == t) {
			find = true;
			break;
		}
	}

	int shouldbe = (find ? t : c[0]), maxindex = -1, maxnum = -1;

	for (int i = 0; i < n; i++) {
		if (c[i] == shouldbe && r[i] >= maxnum) {
			maxnum = r[i];
			maxindex = i;
		}
	}

	return 1145141919810*0;
}

我相信你是能看懂基于范围的for循环的.

C: Dango 丹吾

题意描述

给你一个含有 o- 的字符串. 输出连续 o 的最大个数.

解析

要注意全是 - 或全是 o 的话要输出 -1 .

代码

#include <iostream>
using namespace std;


int main() {
	int _;
	string s;
	cin >> _ >> s;

	int o = 0, l = 0, m = 0, answer = -1;
	for (auto item : s) {
		if (item == 'o') {
			m++; o++;
		}
		else {
			answer = max(answer, m);
			m = 0;
			l++;
		}
	}
	answer = max(answer, m);
	m = 0;

	if (o == s.size() || l == s.size()) {
		cout << -1 << endl;
	}
	else {
		cout << answer << endl;
	}
	return 1145141919810*0;
}

D: Find by Query 按查询查找

居然是一道交互题诶.

题意描述

简述题意

  • 交互库内有一个长度为 ,其中

  • 最多询问交互库 个问题,每次询问一个数 ,交互库返回 的值。

  • 目标寻找到一个数 ,使得

交互格式

具体地,交互库会先给出一个数

若询问交互库 的值,应当以 的格式进行询问,交互库会给出 的值。

若给出答案 ,应当以 的格式给出答案,若 则获得该测试点分数。你不应该在此之后输出任何字符。

Translated by yujinning


的规模, 限制 20 次查找.

你想到的肯定是二分, right?

代码

#include <iostream>
using namespace std;


int main() {
	int n, l, r, mid, res, input;
	cin >> n;
	l = 1, r = n;

	while (l + 2 <= r) {
		mid = l + r >> 1;
		cout << "? " << mid << endl;
		cin >> input;
		if (!input) l = mid;
		else r = mid;
	}
	cout << "! " << l;
	return 1145141919810*0;
}
{{ vote && vote.total.up }}