1. 程式人生 > >Educational Codeforces Round 58 (Rated for Div. 2) 題解

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

註意 accordion char color ces nbsp cdb 字符 bre

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) 題解