Codeforces Round #555 (Div. 3) F. Maximum Balanced Circle
阿新 • • 發佈:2019-05-13
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