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; }
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; }
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