昨晚的A、B、C题都很简单,结束后都都有4000+的AC数。
A
题意:在 \(x\) 轴的 0 点出发,输出一串字符串代表机器人会向左走或者向右走,因为机器人会出故障,导致有些指令会忽略掉,问机器人最终的落点会有多少个。
题解:直接求机器人能到左右端的极限距离再加上原点即可
// https://codeforces.com/contest/1285/problem/A
#include<iostream>
#include<cstdio>
using namespace std;
int T;
char ch[100005];
int main()
{
scanf("%d", &T);
scanf("%s", ch);
int l = 0, r = 0;
for(int i = 0; i < T; i++){
if(ch[i] == 'L') l++; // 记录左端的最大距离
else r++; // 记录右端的最大距离
}
printf("%d\n", l + r + 1); // 加上原点
return 0;
}
B
题意:判断一个数组的全集之和是否严格大于该非空真子集之和
题解:分两部分找非空真子集的最大之和(第一步是除了第一位都取,第二步是除了最后一位都取),然后求最大和的是用最长子序列和来求的
// https://codeforces.com/contest/1285/problem/B
#include<iostream>
#include<cstdio>
using namespace std;
int T, n;
long long num[100005];
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d", &n);
long long tot = 0; // 注意溢出
for(int i = 0; i < n; i++){
scanf("%I64d", &num[i]);
tot += num[i]; // 全集之和
}
long long now = 0, big = -2000000000;
for(int i = 1; i < n; i++){ // 第一步
now += num[i];
if(now > big) big = now;
if(now < 0) now = 0;
}
now = 0;
for(int i = 0; i < n - 1; i++){ // 第二步
now += num[i];
if(now > big) big = now;
if(now < 0) now = 0;
}
if(tot > big) printf("YES\n"); // 如果全集之和比最大的非空真子集之和还要大
else printf("NO\n");
}
return 0;
}
C
题意:输入一个数X,找它的因数a, b,并且max(a, b)是最小的一组
题解:a, b必定是数X的因数,因此可以直接找X的因数下手;同时X是a, b的最小公倍数,所以要检验gcd(a, b) == 1;然后记录max(a, b)最小一组即可
// https://codeforces.com/contest/1285/problem/C
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
LL X, A, B;
LL gcd(LL a, LL b){
if(b != 0) return gcd(b, a % b);
else return a;
}
int main()
{
A = B = 1000000000007;
int a = 10, b = 5;
scanf("%I64d", &X);
for(LL a = 1; a * a <= X; a++){
if(X % a == 0){
LL b = X / a;
if(gcd(a, b) == 1){
LL c = a > b ? a : b;
LL ans = A > B ? A : B;
if(c < ans){
A = a; B = b;
}
}
}
}
printf("%I64d %I64d\n", A, B);
return 0;
}
记录菜鸟的成长:
活成了1300分选手的模样