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

  

 

posted @ 2020-10-28 13:46  高级牛头人  阅读(64)  评论(0编辑  收藏  举报