Occupied city

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

Meaning of the questions: n individual is located on the 1-n coordinates, everyone can step to the right or to the left or does not move. Coordinate range is 0-n + 1.

Ask these people can occupy a minimum number of coordinate, the maximum number of coordinates can be occupied.

Solution: Minimum:. I, i + 1, i + 2 persons coordinate on the i + 1 can be gathered up.

Up: coordinates on the human individual is greater than 1 is dispersed to the sides apart.

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF  0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
using namespace std;
typedef long long ll ;
int a[200009];

int main()
{
    int n ;
    scanf("%d" , &n);
    for(int i = 0 ; i < n ; i++)
    {
        int x ;
        scanf("%d" , &x);
        ++a[x] ;
    }
    int mi = 0 , ma = 0;
    for(int i = 1 ; i <= n ;)
    {
        if(a[i]) i += 3 , mi++;
        else i++;
    }
    for(int i = 1 ; i <= n ; i++)
    {
        if(a[i] > 1) a[i]-- , a[i+1]++ ;
    }
    for(int i = n ; i >= 1 ; i--)
    {
        if(a[i] > 1) a[i]-- , a[i-1]++;
    }
    for(int i = 0 ; i <= n + 1 ; i ++)
    {
        if(a[i]) ma++;
    }
    cout << mi << " " << ma << endl;

    return 0 ;
}

 

Guess you like

Origin www.cnblogs.com/nonames/p/12238036.html