A.Strange Splitting(思维)
题意:
将非空数组的范围定义为最大值减去最小值。例如, [ 1 , 4 , 2 ] [1,4,2] [1,4,2]的范围是 4 − 1 = 3 4-1=3 4−1=3。
给你一个长度为 n ≥ 3 n\geq 3 n≥3的数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an。保证 a a a被排序。
你必须给 a a a中的每个元素涂上红色或蓝色,以便:
- 红色元素的范围不等于蓝色元素的范围,并且
- 每种颜色至少有一个元素。
如果不存在这样的着色,则输出 N O NO NO。如果存在多种有效着色,则可以输出其中任何一种。
分析:
如果 a 1 = a n a_1=a_n a1=an,无解。
如果 a 2 = a n a_2=a_n a2=an, a 1 , a 2 a_1,a_2 a1,a2涂成红色,否则只把 a 1 a_1 a1涂成红色。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i];
if (a[1] == a[n]) {
cout << "NO" << endl;
return;
}
cout << "YES" << endl;
if (a[2] != a[n]) {
cout << "R";
for (int i = 2; i <= n; ++i) {
cout << "B";
}
cout << endl;
return;
}
cout << "RR";
for (int i = 3; i <= n; ++i) {
cout << "B";
}
cout << endl;
}
int main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
B.Large Addition(模拟)
题意:
如果一个数位介于 5 5 5和 9 9 9之间(含),则该数位为大数。如果一个正整数的所有位数都是大数,那么这个正整数就是大正整数。
给你一个整数 x x x。它可以是两个位数相同的大正整数之和吗?
分析:
由于大于等于 5 5 5小于等于 9 9 9的数不管这么组合,两个数字相加的和一定在 10 − 18 10-18 10−18之间,那么可以得到如果给出的数的第一位上不是 1 1 1或者最后一位上是 9 9 9或者或者中间有一位上是 0 0 0,那么就是不存在的,否则就是可行的。
代码:
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
void solve() {
LL x;
cin >> x;
bool flag = 1;
if (x % 10 == 9)
flag = 0;
x /= 10;
while (x) {
int y = x % 10;
if ((y + 9) % 10 == 9)
flag = 0;
if (x < 10 && y > 1)
flag = 0;
x /= 10;
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
int main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
C1.Magnitude (Easy Version)(贪心)
题意:
两个版本的问题是不同的。
给你一个长度为 n n n的数组 a a a。从 c = 0 c=0 c=0开始。然后,对于从 1 1 1到 n n n的每一个 i i i(按递增顺序)做下面的操作之一:
- 选项 1 1 1: 设置 c c c至 c + a i c+a_i c+ai。
- 选项 2 2 2: 设置 c c c至 ∣ c + a i ∣ |c+a_i| ∣c+ai∣, ∣ x ∣ |x| ∣x∣是 x x x的绝对值。
设上述步骤后 c c c的最大终值等于 k k k。求出 k k k。
分析:
发现要么一直不用 2 2 2操作,要么在答案取到最小值的时候使用一遍 2 2 2操作让其变为相对大一些的值。显然使用多遍 2 2 2操作是不优的。然后还能发现若存在一个位置 P P