Educational Codeforces Round 97 (Rated for Div. 2) (已自闭)
我好菜啊。。
明明感觉都很简单,为什么当时没想出来呢?
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; } }