Codeforces Round #611 (Div. 3) E

E. New Year Parties

对于最大值 我们显然可以sort之后 贪心一下即可 正确性显然
对于最小值 我们发现会有三种情况 一种是三个挨在一起 一种是两个挨在一起 还有一种就是两个只隔了一个空隙
我们直接dp求解即可

void solve(){
    int n;cin>>n;
    vector<int>a(n),v(n+1);
    for(int i=0;i<n;i++)cin>>a[i],v[a[i]]++;
    vector<int>b=a;
    sort(all(b));
    b.erase(unique(all(b)),b.end());
    vector<bool>st(n+1);
    int mx=0;
    for(auto i:b){
        if(!st[i-1]&&v[i]){
            mx++;
            v[i]--;
            st[i-1]=1;
        }
        if(!st[i]&&v[i]){
            mx++;
            v[i]--;
            st[i]=1;
        }
        if(!st[i+1]&&v[i]){
            mx++;
            v[i]--;
            st[i+1]=1;
        }
    }
    vector<int>dp(n+10,INF);
    a.clear();a.push_back(0);
    for(auto i:b)a.push_back(i);
    dp[0]=0;
    for(int i=1;i<a.size();i++){
        dp[i]=min(dp[i],dp[i-1]+1);
        if(a[i]==a[i-1]+2&&i>=2)dp[i]=min(dp[i],dp[i-2]+1);
        if(a[i]==a[i-1]+1&&a[i-1]==a[i-2]+1&&i>=3)dp[i]=min(dp[i],dp[i-3]+1);
        if(a[i]==a[i-1]+1&&i>=2)dp[i]=min(dp[i],dp[i-2]+1);
    }
    cout<<dp[(int)a.size()-1]<<' '<<mx<<endl;
}

posted @ 2022-11-02 14:22  ycllz  阅读(27)  评论(0)    收藏  举报