Educational Codeforces Round 58 (Rated for Div. 2) 题解

Posted heyuhhh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 58 (Rated for Div. 2) 题解相关的知识,希望对你有一定的参考价值。

Educational Codeforces Round 58 (Rated for Div. 2) 

题目总链接:https://codeforces.com/contest/1101

A. Minimum Integer

题意:

多组数据,给你三个数l,r,d,要求在区间[l,r]之外找一个最小的x,使得x%d==0。

 

题解:

当d<l or d>r的时候,直接输出d就好了。

当l<=d<=r的时候,找到最小的t,使得t*d>r就行了。

具体操作见代码:

技术分享图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int q;
ll l,r,d;

int main(){
    cin>>q;
    while(q--){
        cin>>l>>r>>d;
        if(d<l || d>r) cout<<d<<endl;
        else{
            ll now = r/d;
            cout<<(now+1)*d<<endl;
        }
    }
    return 0;
}
View Code

 

B. Accordion

题意:

给出一个字符串,要求删去一些数后它由以下几个部分组成,[ : .... : ],这其中"...."指的是0个或多个“ | ”。

问满足上面条件时,留下的字符串的最大长度为多少。

 

题解:

模拟一下就好了,从左往右遍历找 [ 以及 : 

然后再从右往左遍历找 ] 以及 :

最后找中间的 |

这只是大体思路,代码还需要判断这些是否存在(我就是没判断这个被hack了...)、是否满足条件。

 

代码如下:

技术分享图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N  = 5e5+5;
char s[N];
int main(){
    scanf("%s",s);
    int len = strlen(s);
    int j=len,ans=0;
    for(int i=0;i<len;i++){
        if(j==len){
            if(s[i]==[) ans++,j--;
            continue ;
        }else if(j==len-1){
            if(s[i]==:){
                ans++;
                j=i;
                break ;
            }
        }
    }
    int k=0;
    for(int i=len-1;i>=0;i--){
        if(k==0){
            if(s[i]==]) ans++,k++;
            continue ;
        }else if(k==1){
            if(s[i]==:){
                ans++;
                k=i;
                break ;
            }
        }
    }
    if(j>=k) puts("-1");
    else{
        for(int i=j+1;i<k;i++){
            if(s[i]==|) ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}
View Code

 

C. Division and Union

题意:

给出n个区间,然后将这些区间分到两个集合S1,S2中,要求S1与S2的交集为空。最后输出区间是属于1集合还是2集合。

 

题解:

一开始想歪了,用并查集去做,虽然也可以做,但是有点麻烦了。

分析一下就可以发现,相交的区间肯定放在一个集合中,不相交的区间可以放在一个集合中,也可以放在另外一个集合中。

那么我们直接按左端点排序后,贪心地将前n-1个区间放在一个集合中,判断第n个区间放入另一个集合是否满足条件就ok了。

注意的是放入一个集合的时候,需要维护右端点的最大值,这样最后比较的时候才能保证正确性。

 

代码如下:

 

以上是关于Educational Codeforces Round 58 (Rated for Div. 2) 题解的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27