修正了标题和部分错别字
学业沉重,不过现在有时间了
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;
}