热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeforcesRound#555(Div.3)F.MaximumBalancedCircle(思维)

题目链接:http:codeforces.comcontest1157problemF题意:在含有n个元素的数组里选择元素,使得构成一个元素最多的环(环满足相邻元素差的绝对值<

题目链接:http://codeforces.com/contest/1157/problem/F

题意:在含有n个元素的数组里选择元素,使得构成一个元素最多的环(环满足相邻元素差的绝对值<=1)

先处理集合里的元素,统计每个元素的出现次数,并且将集合排好序,去重。

因为构成一个这样的环一定是这样的情况:元素值先上升,后下降,并且下降的元素即为上升元素的倒序,

所以当我们构造这样一个环时,我们就要去找出现次数>=2的元素,多余2的部分全放上升元素这边,下降元素均为1个

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include <set>
#include 
#include <string>
#include 
#include 
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
static const int MAX_N = 2e5 + 5;
static const ll Mod = 2009;
int a[MAX_N], cnt[MAX_N];
void solve(){
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    int k;
    while(scanf("%d", &k) != EOF){
        for(int i = 0; i 0;
        for(int i = 0; i i){
            scanf("%d", &a[i]);
            cnt[a[i]]++;
        }
        sort(a, a + k);
        int tot = unique(a, a + k) - a; //保持单调递增,便于构造
        int ansl = 0, ansr = 0, ansle = cnt[a[0]];
        for(int i = 0, j; i  j){
            j = i + 1;
            int le = cnt[a[i]];
            while(j 1] == 1 && cnt[a[j]] >= 2) le += cnt[a[j++]];
            int r = j - 1;
            if(j 1] == 1) r = j, le += cnt[a[j]];
            if(le > ansle) ansle = le, ansl = i, ansr = r;
        }
        printf("%d\n", ansle);
        if(ansl == ansr){
            for(int i = 0; i "%d%c", a[ansl], i == ansle - 1 ? '\n' : ' ');
            continue;
        }
        for(int i = 0; i "%d ", a[ansl]);   //升序起点
        for(int i = ansl + 1; i i){
            for(int j = 1; j "%d ", a[i]); //留一个给下降元素
        }
        for(int i = 0; i "%d ", a[ansr]);   //升序终点
        for(int i = ansr - 1; i > ansl; --i) printf("%d ", a[i]);
        putchar('\n');
    }
}
int main() {
    solve();
    return 0;
}
View Code

 


推荐阅读
  • 题目描述Takuru是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。Takuru的计划是让Hinae帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takur ... [详细]
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • 题面传送门Solution看到什么最大值最小肯定二分啊。check直接跑一个二分图匹配就好了。orzztl!!!代码实现*mail:mle ... [详细]
  • 为什么即使Linux服务器的socket关闭,客户端仍能调用一次send函数?
    要弄清这个问题,首先需要知道调用send()发送数据时,发生了什么。当调用send()发送数据时,并不是直接将数据发送到网络中,而是先将待发送的数据放到socket发送缓冲区中,然 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • JZOJ 1266. 玉米田
    1266.玉米田(cowfood.pasccpp)(FileIO):input:cowfood.inoutput:cowfood.outTimeLimits:1000msMemor ... [详细]
  • 开发笔记:城市建设
    本文由编程笔记#小编为大家整理,主要介绍了城市建设相关的知识,希望对你有一定的参考价值。本文涉及:cdq分治、MST一道十分精妙的cdq分 ... [详细]
  •   并查集是一种群众喜闻乐见的数据结构,其复杂度是数据结构中最奇葩的之一了,Tarjan证明其为阿克曼函数的反函数,在可以想象(不全面的解释啊)的范围内小于等于3。。。我们就把它当做O(1)吧。下面通 ... [详细]
author-avatar
情深深锋_433
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有