Educational Codeforces Round 102 (Rated for Div. 2)

Educational Codeforces Round 102 (Rated for Div. 2)

A.Replacing Elements

题意: 每次操作都能将某个数字替换为2个数字的和

题解: 如果全部数字都小于等于m或者存在2个数字的和小于等m即可

代码:

#include <bits/stdc++.h>

using namespace std;

int const MAXN = 2e6 + 10;
int n, m, T, a[MAXN];

int main() {
   
    scanf("%d", &T);
    while (T--) {
   
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; ++i) scanf("%d", a + i);
        sort(a + 1, a + 1 + n);
        if (a[n] <= m || a[1] + a[2] <= m) puts("YES");
        else puts("NO");
    }
    return 0;
}

B.String LCM

题意: 给定2个字符串,求2个字符串的lcm

题解: lcm长度为2个字符串长度的lcm。因此只需要判断达到lcm时2个字符串是否相等即可。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
int const N = 2e5 + 10;
int n, m, T;
string s1, s2;

int main()
{
   
    cin >> T;
    while (T--)
    {
   
        cin >> s1 >> s2;
        int len1 = s1.size();
        int len2 = s2.size();
        int len = len1 * len2 / __gcd(len1, len2);
        string res1 = "";
        for (int i = 0; i < len / len1; i++)
            res1 += s1;
        string res2 = "";
        for (int i = 0; i < len / len2; i++)
            res2 += s2;

        if (res1 == res2)
            cout << res1 << endl;
        else
            cout << "-1" << endl;
    }
    return 0;
}

C.No More Inversions

题意: 输入n和k,数组a是从1到k,k到2k-n的数组。b[i] = p[a[i]],要求数组b的逆序对数量小于等于a,求p数组字典序最大,p是1到k的一个排列。

题解: 分析发现就是把重复的那段给倒着打印一下即可。

代码:

#include <bits/stdc++.h>

using namespace std;

int t, n, k;
int main() {
   
    cin >> t;
    while (t--) {
   
        scanf("%d%d", &n, &k);
        for (int i = 1; i < (k - (n - k)); i++) {
   
            printf("%d ", i);
        }
        for (int i = k; i >= (k - (n - k)) ; i--) {
   
            printf("%d ", i);
        }
        puts("");
    }
    return 0;
}

D.Program

题意: 一个机器人一开始位于0点,给定机器人走的路的方向,±-±-,表示右左左右左左。然后给定m个区间:l, r,表示如果忽略第l步 ~ 第r步,那么机器人的会走到的不同的点有多少个。

题解:

方法1:

因为机器人走的路是连续的,因此每次走的路都是在上一次的基础上延续的,因此一个机器人能走到的点就是能够走到的最右侧的位置-能走到的最左侧的位置。而最右侧的位置就是最大的前缀,最左侧的位置就是最小的前缀。

现在分析m次操作,每次[l ~ r]个操作被忽略,那么在1 ~ l - 1步能够走到的点就是1 - l-1的最大最小前缀,在r+1 ~ n能够走到的点就是这个范围内的最大最小前缀-[l, r]位置的偏移量。因此如果记录1 ~ l - 1的最大最小前缀为:maxv1和minv1,记录r + 1 ~ n的最大最小前缀为maxv2和minv2,偏移量为offset,那么答案就是: m a x ( m a x v 1 , m a x v 2 − o f f s e t ) − m i n ( m i n v 1 , m i n v 2 − o f f s e t ) + 1 max(maxv1, maxv2 - offset) - min(minv1, minv2 - offset) + 1 max(maxv1,maxv2offset)min(minv1,minv2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值