前言
好久不见,再为上周出的小白月赛给大家带来不好的体验道个歉,不会G待补,看不懂我的文字题解的去牛客b站的官网看视频题解,讲得很好!
题解
A.小苯晨跑
用任何你喜欢的方式判断这四个数是否相等
#include<bits/stdc++.h>
using i64 = long long;
void solve() {
std::vector<int> a(5);
for (int i = 1; i <= 4; i++) {
std::cin >> a[i];
}
std::sort(a.begin() + 1, a.end());
if (a[1] == a[4]) {
std::cout << "NO\n";
}
else {
std::cout << "YES\n";
}
}
signed main() {
std::ios::sync_with_stdio(0);
std::cout.tie(0);
std::cin.tie(0);
i64 t = 1;
std::cin >> t;
while (t--) {
solve();
}
}
B.小苯过马路
由于题中说了一旦开始走了就不会停下,那我们就看看什么时候会出发就好了,如果当前是绿灯,并且剩余的时间足够小苯过马路,那就会立即出发,如果不够,那就等到下一个绿灯再出发,如果当前是红灯,那就等到绿灯出发就好了。
#include<bits/stdc++.h>
using i64 = long long;
void solve() {
int x, y, k, t;
char c;
std::cin >> x >> y >> k >> t >> c;
if (c == 'G') {
if (t <= k) {
std::cout << t << '\n';
}
else {
std::cout << t + k + x << '\n';
}
}
else {
std::cout << k + t << '\n';
}
}
signed main() {
std::ios::sync_with_stdio(0);
std::cout.tie(0);
std::cin.tie(0);
i64 t = 1;
// std::cin >> t;
while (t--) {
solve();
}
}
C.小苯的字符串染色
选择一个奇数长度的区间,还不超过n次操作,这不就是在暗示我挨个染一遍就好了吗!管他是黑还是白,都只对这一个操作染成白的
#include<bits/stdc++.h>
using i64 = long long;
void solve() {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
s = ' ' + s;
std::cout << n << '\n';
for (int i = 1; i <= n; i++) {
std::cout << i << ' ' << i << '\n';
}
}
signed main() {
std::ios::sync_with_stdio(0);
std::cout.tie(0);
std::cin.tie(0);
i64 t = 1;
std::cin >> t;
while (t--) {
solve();
}
}
D.小苯的能量项链
维护求一个后缀最大值即可,然后我们枚举删除从左数几个,去看后缀最大值是多少,比如n==5 , k==4时,我们枚举左边删除2个,那么还可以删除两次,那我们就看从右往左的3个中最大的是那个保存就好了,至于删除两次为什么会去比较三个中的最大值,那当然是因为不删除,删除一个和删除两个会剩下的了!
#include<bits/stdc++.h>
using i64 = long long;
void solve() {
int n, k;
std::cin >> n >> k;
std::vector<int> a(n + 1);
for (int i = 1; i <= n; i++) {
std::cin >> a[i];
}
if (n == 1) {
std::cout << a[1] << '\n';
return;
}
std::vector<int> suf(n + 2, -1);
for (int i = n; i >= 1; i--) {
suf[i] = std::max(a[i], suf[i + 1]);
}
suf[0] = suf[1];
int ans = a[1] + a[n];
for (int i = 1; i <= std::min(n, k); i++) {
ans = std::max(ans, a[i] + suf[std::max(i + 1, n - (k - i + 1))]);
}
std::cout << ans << '\n';
}
signed main() {
std::ios::sync_with_stdio(0);
std::cout.tie(0);
std::cin.tie(0);
i64 t = 1;
std::cin >> t;
while (t--) {
solve();
}
}
E.小苯的最短路
这个我纯猜,大家可以把n==3的答案算出来,会发现是1,那我们观察n分别为1,2,3,4时的答案,答案就是1到n的异或和,这个时候你算出来肯定会说样例都过不了!对了,我们再观察一下,会发现n为奇数时,给答案异或上一个1就是答案。具体证明过程去看视频讲解吧
#include<bits/stdc++.h>
using i64 = long long;
int xorSum(int n) {
if (n % 4 == 0)
return n;
else if (n % 4 == 1)
return 1;
else if (n % 4 == 2)
return n + 1;
else
return 0;
}
void solve() {
int n;
std::cin >> n;
int x = xorSum(n);
if (n & 1) {
std::cout << (x ^ 1) << '\n';
}
else {
std::cout << x << '\n';
}
}
signed main() {
std::ios::sync_with_stdio(0);
std::cout.tie(0);
std::cin.tie(0);
i64 t = 1;
std::cin >> t;
while (t--) {
solve();
}
}
F.小苯的优雅好序列
这个建议直接去看视频题解吧,我还是猜,代码仅供参考,我也不知道该怎么说。
#include<bits/stdc++.h>
using i64 = long long;
void solve() {
int n, k;
std::cin >> n >> k;
std::set<int> st;
for (int i = 1; i <= n; i++) {
int a;
std::cin >> a;
st.insert(a);
}
if (st.size() == 1) {
std::cout << k << ' ' << 1ll * k * (1 + k) / 2 << '\n';
return;
}
std::vector<int> a;
for (auto it : st) {
a.push_back(it);
}
n = a.size();
int g = 0;
for (int i = 1; i < n; i++) {
g = std::__gcd(a[i] - a[i - 1], g);
}
i64 cnt = 0, ans = 0;
for (int i = 1; i * i <= g; i++) {
if (g % i == 0) {
if (i - a[0] >= 1 && i - a[0] <= k) {
cnt++;
ans += i - a[0];
}
if (g / i != i) {
if (g / i - a[0] >= 1 && g / i - a[0] <= k) {
cnt++;
ans += g / i - a[0];
}
}
}
}
std::cout << cnt << ' ' << ans << '\n';
}
signed main() {
std::ios::sync_with_stdio(0);
std::cout.tie(0);
std::cin.tie(0);
i64 t = 1;
std::cin >> t;
while (t--) {
solve();
}
}