Codeforces Round #611 (Div. 3) E题

每个房子可以住人,输入n个人,每个人可以向左或者向右移动一个位置,求最少占房子的数量和最大占房子的数量。
最小:从有人的开始数三个可以到中间的房子里
最大:从左往右扫,大于一的往右一挪,再从右往左扫,大于一的往左诺,因为是大于一,所以不会有人移动两次

int maxx[MAXN],minn[MAXN];

int main() {
    int n,x;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> x;
        maxx[x]++;
        minn[x]++;
    }
    for(int i = 1; i <= n; i++) {
        if(maxx[i] > 1)  {
            maxx[i+1]++;maxx[i]--;
        }
    }
    for(int i = n; i >= 1; i--) {
        if(maxx[i] > 1) {
            maxx[i-1]++;maxx[i]--;
        }
    }
    int maxi = 0,mini = 0;
    for(int i = 0; i <= n+1; i++) {
        if(maxx[i] > 0) maxi++;
    }
    for(int i = 1; i <= n;) {
        if(minn[i]) {
            mini++;
            i+=3;
        }
        else i++;
    }
    cout << mini << " " << maxi << endl;
    system("pause");
    return 0;
}

你可能感兴趣的:(Codeforces Round #611 (Div. 3) E题)