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 namespaceView Codestd; 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> usingView Codenamespace 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) 題解