Description

Input

第一行一个数 n,表示序列的长度。
第二行 n 个整数,第 i 个整数表示 ai,如果 ai = 0,则表示这个位置没有填数。

Output

如果不存在合法的填数方案,则输出 −1; 否则第一行输出一个整数,表示最大的 an;第二行 n 个正整数,第 i 个数表示完 成填数后的序列的第 i 个元素。 如果有多组合法的解,输出任意一组

Sample Input

【样例 1 输入】
7
0 1 0 0 0 3 0
【样例 2 输入】
4
0 0 0 3

Sample Output

【样例 1 输出】
3
1 1 2 2 3 3 3
【样例 2 输出】
-1

Data Constraint

对于 30% 的数据,n ≤ 1000;
对于另外 30% 的数据,数据保证随机生成;
对于 100% 的数据,2 ≤ n ≤ 2 × 10^5 , 0 ≤ ai ≤ 10^5。

题解

  • 我们可以先定义一个up数组和一个down数组,up表示可能走到的最大值,down表示可能走到的最小值
  • 那么对于没有填的数,先不考虑填了的数,up两个进1,down五个进1肯定是它们要表示的值
  • 那么如果对于填了的数,先考虑上界
  • 那么现将上界定到填的数,然后长度为2,如果填的数等于上界,在上界求出来的长度和2取min
  • 下界的话,将下界定到填的数,长度为1
  • 如果最后up[n].l=1的话,也就说明了up[n].x不可以填的,不是最大值
  • 因为在所有情况都是最优下,只剩1的长度,没有比这种情况更优的,所以up[n].x是填不了的
  • 现在最大值也确定了,只要找到一种方法填数就好了
  • 然后,从后往前跑,那么对于有填的数,直接s[a[i]]++
  • 没填的数,在a[i+1]和up[i].x取min值
  • 如果s[min]=5的话,往前走一位就好了
  • 还有-1的情况,有以下几种情况:
  • ①a[i]>1
  • ②up[n].x<down[n].x
  • ③up[i].x<a[i]||down[i].x>a[i]

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cmath>
 5 using namespace std;
 6 struct edge {int x,l;}up[200010],down[200010];
 7 int a[200010],n,s[200010],k;
 8 int main()
 9 {
10     scanf("%d",&n);
11     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
12     if (a[1]>1)
13     {
14         printf("-1");
15         return 0;
16     }
17     up[1].x=1,up[1].l=1;
18     down[1].x=1,down[1].l=1;
19     for (int i=2;i<=n;i++)
20     {
21         down[i]=down[i-1];
22         if (++down[i].l>5) ++down[i].x,down[i].l=1;
23         up[i]=up[i-1];
24         if (++up[i].l>2) ++up[i].x,up[i].l=1;
25         if (a[i]>0)
26         {
27             if (up[i].x>a[i]) up[i].x=a[i],up[i].l=2; else if (up[i].x==a[i]) up[i].l=min(up[i].l,2);
28             if (down[i].x<a[i]) down[i].x=a[i],down[i].l=1;
29             if (up[i].x<a[i]||down[i].x>a[i])
30             {
31                 printf("-1");
32                 return 0;
33             }
34         }
35     }
36     if (up[n].l==1) up[n].x--,up[n].l=5;
37     if (up[n].x<down[n].x)
38     {
39         printf("-1");
40         return 0;
41     }
42     printf("%d\n",a[n]=up[n].x);
43     s[a[n]]=1;
44     for (int i=n-1;i>=1;i--)
45     {
46         if(!a[i])
47         {
48             k=min(a[i+1],up[i].x);
49             k-=s[k]==5,a[i]=k;
50         }
51         s[a[i]]++;
52     }
53     for (int i=1;i<=n;i++) printf("%d ",a[i]);
54     return 0;
55 }

转载于:https://www.cnblogs.com/Comfortable/p/9471061.html

[贪心][模拟] Jzoj P5811 简单的填数相关推荐

  1. NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

    简单的区间 $update$ 终于$AC$了 找到$(sum[r]+sum[l](sum表示以中间点为基准的sum)-mx)\%k==0$的点 注意这里$sum$表示是以$mid$为基准点,(即$su ...

  2. 【NOIP2015】【Luogu2615】神奇的幻方(模拟填数)

    problem 给一定n*n的矩阵,要求填上1~n*n的数,使之每行.列.对角线的和都相等. n为奇数时,按如下步骤构建: 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列 ...

  3. 校内hu测(10.6T2,T3)(乱搞+贪心+模拟)

    @liu_runda T2.便(then) [题目描述] 给出一个R*C的棋盘.共有R行C列,R*C个格子.现要在每个格子都填一个非负整数.使得任意一个2*2的正方形区域都满足这样的性质:左上角的数字 ...

  4. 数据结构-挖坑填数+分治法解决快速排序问题(java+c)

    文章目录 一.定义 1.分治法 2.挖坑填数 3.快速排序思想 二.代码实例 1.Java 2.c语言 看到网上有很多的讲解,决定自己整理一遍 首先上定义 一.定义 1.分治法 分治算法的基本思想是将 ...

  5. 2020年第十一届蓝桥杯 - 省赛 - C/C++大学生A组 - C.蛇形填数

    2020年第十一届蓝桥杯 - 省赛 - C/C++大学生A组 - C.蛇形填数 Ideas 这题其实严格意义上属于一道找规律的题目,并不是啥算法题. 我们可以先按照它的规律多写几行. 1 2 6 7 ...

  6. 2020年第十一届蓝桥杯 - 省赛 - Python大学组 - D.蛇形填数

    这道题同样还是: 2020年第十一届蓝桥杯 - 省赛 - C/C++研究生组 - D.蛇形填数 2020年第十一届蓝桥杯 - 省赛 - Java研究生组 - D.蛇形填数 Ideas 这题其实严格意义 ...

  7. 【NOIP2018】DAY2T2——填数游戏(轮廓线状压的dp?搜索打表)

    描述 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个n × m的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 0 或者数字 1),填数时需要满足一些限制. 下 ...

  8. 用C语言模拟栈(简单实现)

    //C语言模拟栈,简单实现 #include <stdio.h> #include <stdlib.h> typedef struct Node node; struct No ...

  9. 蓝桥杯第七届国赛JAVA真题----七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  10. 多项式辗转相除法求最大公约数_点灯游戏、方格填数与 Chebyshev 多项式(续)...

    本文是上一篇文章的续集. 预告:上篇文章说过的基解可视化在本文末尾,不想看中间推导过程的可以直接拉到最底下看图.个人觉得这些图都相当地优美,大概这就是数学的魅力吧. Chebyshev 多项式的性质 ...

最新文章

  1. FAGLF101 应收(付)重组配置和操作
  2. 二分+最大化最小值 River Hopscotch POJ - 3258
  3. 告别程序员生涯,一点感慨,与诸君共勉(转)
  4. 【C语言】(数组)C语言字符串中的小写字母转换为大写字母
  5. Spark UI (基于Yarn) 分析与定制
  6. 网络战争阴影临近,伊朗核设施受攻击
  7. linux 路由表及路由设置
  8. mysql锁问题吗_Mysql锁的问题和解析
  9. 关于BASE编码 16 32 36 58 64 58 91
  10. 抖音电商如何直播带货留人,以及催促成交技巧丨国仁网络
  11. java 调用弗雷_JAVASE(九)面向对象特性之 : 继承性、方法重写、关键字super、
  12. oracle试题和答案,Oracle面试题及答案
  13. 七零年代摄影师Robert Mapplethorpe
  14. Vue 使用 Vue-socket.io 实现即时聊天应用(实战篇 二)
  15. 毫无保留!珍藏多年的“学习”网站...
  16. 微信小程序内七牛云图片显示异常
  17. 基于逻辑回归算法的心脏病不平衡数据分类代码实现
  18. 脚本录制软件python 按键精灵 tc_使用Python来做一个屏幕录制工具的操作代码
  19. 像CTO一样思考:如何高效管理30人的研发团队?
  20. 蓝奥声智能灯控解决方案:一种无线单火取电控制技术

热门文章

  1. 【渝粤教育】电大中专Office办公软件_1作业 题库
  2. 【渝粤题库】陕西师范大学800000 地图学原理
  3. windows环境下的YOLO3入门,及opencv344配置
  4. 【RLchina第六讲】Imitation Learning
  5. jq22扒的网站, 左右箭头图标问题
  6. bzoj 1072: [SCOI2007]排列perm
  7. 深入理解计算机系统(1.3)------操作系统的抽象概念
  8. CPU 用户时间 系统时间
  9. [转]vc++ release 版的生成
  10. 浏览器HTTP缓存机制 1