cf1283E——贪心

想了下dp的做法感觉不太行,我也只配做div3了哎

求最小值的策略:前面没有就把当前的所有人都移到后面去,前面有人就挪到前面去

求最大值的策略:前面没有就挪一个到前面,然后考虑当前位置,下一个位置

/*
dp[i][0]表示向前移动了,dp[i][1]表示不动,dp[i][2]表示后移 
*/
#include<bits/stdc++.h>
using namespace std;
#define N 200005
int n,a[N],cnt[N],has[N];

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],cnt[a[i]]++;
    for(int i=1;i<=n;i++)if(cnt[i]){
        if(has[i])continue;
        if(has[i-1])continue;
        if(!has[i-1])
            has[i+1]=1;
    }    
    
    int tot=0;
    for(int i=0;i<=n+1;i++)tot+=has[i];
    cout<<tot<<" ";
    
    memset(has,0,sizeof has);
    
    for(int i=1;i<=n;i++)if(cnt[i]){
        if(!has[i-1])cnt[i]--,has[i-1]=1;
        if(cnt[i]){
            if(has[i])has[i+1]=1;//移到后面 
            else {
                has[i]=1;
                if(cnt[i]>1)
                    has[i+1]=1;
            }
        }
        
    }
    tot=0;
    for(int i=0;i<=n+1;i++)tot+=has[i];
    cout<<tot;
}

posted on 2020-01-02 17:42  zsben  阅读(195)  评论(0编辑  收藏  举报

导航