「解题报告」Codeforces Round 886 (Div. 4)
比赛地址:Dashboard - Codeforces Round 886 (Div. 4) - Codeforces
由于时间太晚了,因此并没有参加比赛,题目都是后来补做的。
A. To My Critics
\(T\) 组数据,有 \(a, b, c\) 三个数,判断是否存在两个数的和 \(sum \ge 10\)。
/*
The code was written by yifan, and yifan is neutral!!!
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>
inline T read() {
T x = 0;
bool fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
}
void solve() {
int a = read<int>(), b = read<int>(), c = read<int>();
if (a + b >= 10 || b + c >= 10 || a + c >= 10) {
puts("Yes");
} else {
puts("No");
}
}
int main() {
int T = read<int>();
while (T --) {
solve();
}
return 0;
}
B. Ten Words of Wisdom
\(T\) 组数据,有 \(n\) 个人,每个人有一个反应,第 \(i\) 个人的反应长度为 \(a_i\),质量为 \(b_i\)。现在求出长度小于等于 \(10\) 的质量最高的人的编号。
/*
The code was written by yifan, and yifan is neutral!!!
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>
inline T read() {
T x = 0;
bool fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
}
int n, a, b;
void solve() {
n = read<int>();
int mx = 0, pos = 0;
for (int i = 1; i <= n; ++ i) {
a = read<int>(), b = read<int>();
if (a <= 10) {
if (b > mx) {
mx = b;
pos = i;
}
}
}
cout << pos << '\n';
}
int main() {
int T = read<int>();
while (T --) {
solve();
}
return 0;
}
C. Word on the Paper
有一个 \(8 \times 8\) 的网格图,有一个单词在网格图中从上写到下,询问这个单词。
/*
The code was written by yifan, and yifan is neutral!!!
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>
inline T read() {
T x = 0;
bool fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
}
char c;
char str[10];
void solve() {
memset(str, '\0', sizeof str);
int l = 0;
for (int i = 1; i <= 8; ++ i) {
for (int j = 1; j <= 8; ++ j) {
cin >> c;
if (c >= 'a' && c <= 'z') {
str[l ++] = c;
}
}
}
cout << str << '\n';
}
int main() {
int T = read<int>();
while (T --) {
solve();
}
return 0;
}
D. Balanced Round
有 \(n\) 个数,还有一个整数 \(k\),现在这 \(n\) 个数可以随便排序,也可以从这 \(n\) 个数中删去一些数,问最少删多少个数,可以使得剩下的数两两之间差的绝对值小于等于 \(k\)。
转化一下,根据相邻两个数之间的差的绝对值大于 \(k\),可以将这 \(n\) 个数分成若干段区间,求长度最大的区间,最后用 \(n\) 减去这个最大区间的长度即可。
/*
The code was written by yifan, and yifan is neutral!!!
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>
inline T read() {
T x = 0;
bool fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
}
const int N = 2e5 + 5;
int n, k;
int g[N];
vector<int> pos;
void solve() {
pos.clear();
n = read<int>(), k = read<int>();
for (int i = 1; i <= n; ++ i) {
g[i] = read<int>();
}
sort(g + 1, g + n + 1);
pos.emplace_back(1);
for (int i = 2; i <= n; ++ i) {
if (g[i] - g[i - 1] > k) {
pos.emplace_back(i);
}
}
pos.emplace_back(n + 1);
int siz = pos.size(), mx = -1;
for (int i = 1; i < siz; ++ i) {
mx = max(mx, pos[i] - pos[i - 1]);
// cout << pos[i] - pos[i - 1] << '\n';
}
cout << (mx == -1 ? n : n - mx) << '\n';
}
int main() {
int T = read<int>();
while (T --) {
solve();
}
return 0;
}
E. Cardboard for Pictures
有 \(n\) 个正方形,现在给每个正方形的边长加上 \(2w\),使得总面积为 \(c\),求 \(w\)。
一开始想的解方程,结果怎么着都避免不了爆 long long
,后来在旁边的大佬的提醒下用了二分。
/*
The code was written by yifan, and yifan is neutral!!!
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template<typename T>
inline T read() {
T x = 0;
bool fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
}
const int N = 2e5 + 5;
int n;
ll c, sum;
ll d[N];
int check(ll w) {
sum = 0;
for (int i = 1; i <= n; ++ i) {
sum += (d[i] + 2 * w) * (d[i] + 2 * w);
if (sum > c) return false;
}
return true ;
}
void solve() {
n = read<int>(), c = read<ll>();
for (int i = 1; i <= n; ++ i) {
d[i] = read<ll>();
}
ll l = 1, r = 1e9, ans = 0;
while (l <= r) {
ll mid = (l + r) >> 1;
if (check(mid)) {
l = mid + 1;
ans = mid;
} else {
r = mid - 1;
}
}
cout << ans << '\n';
}
int main() {
int T = read<int>();
while (T --) {
solve();
}
return 0;
}
F. We Were Both Children
暴力跳即可,相信看到这里的聪明的你一定可以看懂。
/*
The code was written by yifan, and yifan is neutral!!!
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>
inline T read() {
T x = 0;
bool fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
}
const int N = 2e5 + 5;
int n;
int d[N], in[N];
void solve() {
n = read<int>();
for (int i = 1; i <= n; ++ i) {
d[i] = in[i] = 0;
}
for (int i = 1, x; i <= n; ++ i) {
x = read<int>();
if (x <= n) {
++ in[x];
}
d[i] = 0;
}
for (int i = 1; i <= n; ++ i) {
for (int j = i; j <= n; j += i) {
d[j] += in[i];
}
}
cout << *max_element(d + 1, d + n + 1) << '\n';
}
int main() {
int T = read<int>();
while (T --) {
solve();
}
return 0;
}
到此为止了。
朝气蓬勃 后生可畏