Codeforces Round #611 (Div. 3)E. New Year Parties

https://codeforces.com/contest/1283/problem/E

题意:n个人位于1-n坐标上,每一个人可以向左或向右移动一步或不移动。坐标范围为0-n+1.

问这些人最少可以占领多少个坐标,最多可以占领多少个坐标。

解法:最少:i , i+1 , i+2 .坐标上的人可以聚集到i+1上来。

最多:将大于1个人的坐标上的人向两边分散开来。

const int maxn = 2e5+9;
int vis[maxn];
void solve(){
    int n ;
    cin >> n ;
    rep(i , 1 ,  n){
        int x ;
        cin >> x;
        vis[a[i]]++;
    }
    int mi = 0 , ma = 0;
    for(int i = 1 ; i <= n ;){//周围向一个位置靠拢
        if(vis[i]){
            i += 3 , mi++;
        }else{
            i++;
        }
    }
    rep(i , 0 , n){
        if(vis[i] > 1) vis[i]-- , vis[i+1]++;//向右边散开
    }
    red(i , n+1 , 1){
        if(vis[i] > 1) vis[i]-- , vis[i-1]++;//向左边散开
    }
    rep(i , 0 , n+1){
        ma += vis[i] == 0 ? 0 : 1 ;
    }
    cout << mi << " " << ma << endl;
}

 

posted @ 2020-01-28 14:25  无名菜鸟1  阅读(158)  评论(0编辑  收藏  举报