1. 程式人生 > 實用技巧 >Educational Codeforces Round 97 (Rated for Div. 2) (已自閉)

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