1. 程式人生 > >Codeforces Round #555 (Div. 3) F. Maximum Balanced Circle

Codeforces Round #555 (Div. 3) F. Maximum Balanced Circle

urn using out block () imu lin name ans

F. Maximum Balanced Circle

題目鏈接

題意

給出\(n\)個數,現在要從中選出最多的數\(b_i,b_{i+1},\cdots,b_k\),將這些數連成一個環,要求兩兩相鄰的數相差不超過1。
最後要求輸出具體的方案。

題解

一開始想了一個dp,似乎也可以做
這個題也不用這麽復雜,因為相差絕對值不超過1,直接統計一下每個數的個數就行了。
因為如果將最後的環給展開,以每個數的值為高,呈現出來的圖形一定是先上升後下降的。那麽中間部分的數的個數一定大於等於2,最左邊和最右邊的兩個數特殊考慮一下就行了。
代碼如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n;
int a[N], c[N];
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]), c[a[i]]++;
    int ans = 0;
    int l, r;
    int ansl, ansr;
    int sum = 0;
    for(int i = 1; i < N; i++) {
        if(c[i] >= 1 && sum == 0) {
            l = i;
            sum += c[i] ;
        }else if(c[i] > 1) {
            sum += c[i];
        }else if(sum > 0){
            if(c[i] == 1) sum++, r = i;
            else r = i - 1;
            if(sum > ans) {
                ans = sum ;
                ansl = l;
                ansr = r;
            }
            sum = 0;
            if(c[i] == 1) {
                sum++;
                l = i;
            }
        } 
    }
    cout << ans << '\n' ;
    if(c[ansl] == 1) cout << ansl << ' ', ansl++ ;
    for(int i = ansl; i <= ansr; i++) {
        for(int j = 1; j < c[i]; j++) {
            printf("%d ",i) ;
        }
    }
    for(int i = ansr; i >= ansl; i--) {
        printf("%d ",i);
    }
    return 0;
}

Codeforces Round #555 (Div. 3) F. Maximum Balanced Circle