Codeforces Round #743 (Div. 2)部分题解

A

点击此处查看对应的题目.
本题涉及算法:贪心
本题结果是想要让题目给出的数字变为0,通过将最后一位减为0来实现,那么其实也就很简单了。如果只有最后一位则直接得到最后一位的值即为答案,若其他位有数字则将其他位置的数字换到最后一位即可,所以总操作数就是所有位的值相加和交换的次数的总和。

时间复杂度 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
using namespace std;
const int N = 500;
int n;

void solve()
{
   string s;
   int cnt = 0;
   cin >> n >> s;
   for(int i = 0;i < n;i ++){
        if(i == n - 1 && s[i] != '0') cnt += (s[i] - '0');
        else if(i != n - 1 && s[i] != '0' ) cnt += ((s[i] - '0') + 1);
   }
   cout << cnt << '\n';
}
int main()
{
    int t;
    cin >> t;
    while(t -- ){
        solve();
    }
    return 0;
}

B

点击此处查看对应的题目.
本题涉及算法:贪心
本题的任务是用交换相邻元素的方式处理题目给出的a,b数组,使得a字典序小于b。

首先分析题目条件,题目给出的a,b数组实际上是一个奇数数组,一个偶数数组,且元素各不相同。由于 ( 1 < a i < 2 ∗ n ) ( 1 < b i < 2 ∗ n ) ( 1<a_i<2*n)(1<b_i<2*n) (1<ai<2n)(1<bi<2n),所以所有元素值作为下标放在一起时是正好填满2*n的。

因为数组a是奇数而数组b是偶数,所以无论我们如何执行操作,它们在第一个位置都是不同的。为了使第一个数组按字典序小于第二个我们需要做的事是令第一个元素小于b数组的第一个元素,使第i个元素后移动到第一位置,我们可以对元素执行操作i−1,i−2,……2, 1,这是最优的。那么答案就是i+j−2对所有ai, bj的最小值,使ai<bj。

下面讲一下具体做法:我们将从最大到最小的数开一个order数组存储所有值的再数组中的顺序。设l是已经考虑过的数列b中最左边的数。如果i是偶数,我们设l为 m i n ( l , o r d e r i ) min(l,order_i) min(lorderi)如果i是奇数,我们将答案设为 m i n ( r e s , o r d e r i + l ) min(res,order_i+l) min(resorderi+l)

时间复杂度 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10,INF = 1e9;
int n;
int order[N];

void solve()
{
    int n,x;
    cin >> n;
    for(int i = 0;i < n;i ++){
        cin >> x;
        order[x] = i;
    }
    for(int i = 0;i < n;i ++){
        cin >> x;
        order[x] = i;
    }

    int minn = INF,l = n;
    for(int i = 2 * n;i > 0;i --){
       if(i % 2) minn = min(minn,order[i] + l);
       else l = min(l,order[i]);
    }
    cout << minn << '\n';
}
int main()
{
    int t;
    cin >> t;
    while(t -- ){
        solve();
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

marvel121

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值