Educational Codeforces Round 97 (Rated for Div. 2) (已自閉)
阿新 • • 發佈:2020-10-28
我好菜啊。。
明明感覺都很簡單,為什麼當時沒想出來呢?
A. Marketing Scheme
題意:給出一段從L到R的區間,能否找出一個x數,使得區間任意的一個數mod x>=x/2.
一個數能取模最大的就是其本身,所以讓一個數 a mod x 最大,應該讓 x>a 說以我們讓x取r+1,即L到R區間所有數都為其本身
如果讓區間內任意一個數a mod x>=x/2,即判斷區間內最小的數L mod x>=x/2
#include <iostream> using namespace std; int t,l,r; int main(){ cin>>t; while(t--){ cin>>l>>r; if((r+1)/2.0<=l){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } }
B. Reverse Binary Strings
題意,由偶數個數量相等0和1組成的字串,反向其中任意字串,問最少反向幾次能得到010101...或101010...這樣的字串
統計字串中字串01的個數,和10的個數,從中取max,即字串中不需反向的個數,用其(總串-不需反向的個數)/2即可
#include <iostream> #include <string> using namespace std; typedef long long ll; int t,n; string s; int main(){ cin>>t; while(t--){ cin>>n; cin>>s; int cnt1=0,cnt2=0,ans=0; for(int i=0;i+1<s.size();i++){ if(s[i]=='1'&&s[i+1]=='0'){ cnt1++; } if(s[i]=='0'&&s[i+1]=='1'){ cnt2++; } } ans=max(cnt1,cnt2); cout<<(n-ans*2)/2<<endl; } }
C. Chef Monocarp
首先給上菜時間排個序,暴力每個時間節點選擇是選擇取菜還是不取菜,最後加上記憶化搜尋
#include <iostream> #include <algorithm> #include <string> using namespace std; typedef long long ll; int t,n; int a[1000],dp[1000][1000]; int dfs(int tim,int cur){ if(cur==n+1){ return 0; } if(tim==500){ return 1e9; } if(dp[tim][cur]!=-1) return dp[tim][cur]; int ans=1e9; ans=min(ans,dfs(tim+1,cur+1)+abs(tim-a[cur])); ans=min(ans,dfs(tim+1,cur)); //cout<<"ans="<<ans<<" "<<abs(tim-a[cur])<<endl; return dp[tim][cur]=ans; } int main(){ cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=0;i<=600;i++){ for(int j=0;j<=n;j++){ dp[i][j]=-1; } } sort(a+1,a+1+n); cout<<dfs(1,1)<<endl; } }
D. Minimal Height Tree
模擬上層有多少節點,再統計這層有多少節點,遞增的節點對上層能放一個節點上,當上層節點數用完,就將本層的節點數當上層,ans++,繼續統計下層。
#include <iostream> using namespace std; const int N=2e5+7; int t,n,a[N]; int main(){ cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } a[n+1]=-1; int cnt=0,now=1,ans=0; for(int i=2;i<=n;i++){ cnt++; if(a[i]<a[i+1]){ }else{ now--; } if(i==n&&now!=0){ ans++; } if(now==0){ ans++; now=cnt; cnt=0; } } cout<<ans<<endl; } }