zoukankan      html  css  js  c++  java
  • Codeforces Round #555 (Div. 3) F. Maximum Balanced Circle

    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 << '
    ' ;
    	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;
    }
    
  • 相关阅读:
    Emacs 安装 jedi
    PHP+ MongoDB
    Debian 7 安装 Emacs 24.3
    在Code first中使用数据库里的视图
    Emacs安装auto-complete
    Debian 7.4 中配置PHP环境
    ASP.NET MVC 下载列表
    JDicom使用指南
    Windows常用的DOS命令
    Entity Framework问题总结
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10853784.html
Copyright © 2011-2022 走看看