题目描述

Once upon a time, high up on Mount Olympus, it came to pass that the gods held a competition to see who among them was the best at sorting lists of integers. Eris, the goddess of discord, finds this terribly boring and plans to add some mischief to the mix to make things more fun. She will sabotage the answers of Zeus so that his list of numbers is no longer sorted, which will no doubt be so embarrassing that he becomes furious and starts a minor war.

Eris must be careful not to be discovered while performing her sabotage, so she decides to only change a single digit in one of the numbers in Zeus’ answer. The resulting number may not have any leading zeros (unless it becomes equal to zero in which case a single zero digit is allowed). Eris can only replace a digit with another digit – adding or removing digits is not allowed

输入描述:

The first line of input contains n (2 ≤ n ≤ 100), the length of Zeus’ answer. The second line contains n integers a1,a2,...,ana_1, a_2,..., a_na1​,a2​,...,an​(0≤a1≤a2≤...≤an≤10150 \leq a_1\leq a_2 \leq...\leq a_n \leq 10^{15}0≤a1​≤a2​≤...≤an​≤1015), Zeus’ answer

输出描述:

If Eris can make the list not be sorted by changing a single digit of one of the numbers, then output n integers b1, . . . , bn, the resulting list of numbers after making the change. Otherwise, output “impossible”. If there are many valid solutions, any one will be accepted.

示例1

输入

3

2020 2020 2020

输出

2021 2020 2020

示例2

输入

2
1 9999999

输出

impossible

示例3

输入

4
1 42 4711 9876

输出

1 42 4711 3876

原题链接:https://ac.nowcoder.com/acm/contest/18456/A

题目翻译:

很久以前,在高高的奥林匹斯山上,众神举行了一场比赛,看他们中谁最擅长对整数列表进行排序。不和谐女神厄里斯觉得这非常无聊,打算在比赛中加入一些恶作剧,让事情变得更有趣。她将破坏宙斯的答案,使他的数字列表不再被排序,这无疑会让他感到非常尴尬,从而大发雷霆,发动一场小型战争。

厄里斯在进行破坏时必须小心谨慎,以免被发现,所以她决定只改变宙斯答案中的一个数字的一个数字。所得到的数字不能有任何前导零(除非它变成等于零,在这种情况下允许有一个零位)。厄里斯只能用另一个数字替换一个数字,不允许增加或删除数字。

解释:

输入一个n,代表有序数列的数字个数;下面一行输入有序数列a1,a2...,an;(0≤a1≤a2≤...≤an≤10^15)

输出是否可以进行破坏,若可输出破坏后的序列;否则输出impossible。

题解:

分析题意,如果要达到可以破坏的条件(改变其中一个数字的某一个数字使数列无序);那么相邻元素ax与ay必须是相同位数的。并且对应每一个数,一方面需要考虑其是否可以比前一个数小,另一方面还要考虑其是否可以比后一位数大,以实现破坏的效果。(首尾只需考虑后一位和前一位)

那么,通过分析,我们便得到了解题的关键步骤:

对整个an数组历遍,对于每一个数字我们进行一个这样的过程:

//判断a(i)对于其左端的是否可以达到破坏条件
if(a(i)位数!=a(i-1)的位数){ continue;}
else{   判断 a(i)是否可以比a(i-1)小,如果可以把a(i)换为比a(i-1)小的数,break;若不可以continue }//判断a(i)对于其右端的是否可以达到破坏条件
if(a(i)位数!=a(i+1)的位数){ continue;}
else{   判断 a(i)是否可以比a(i+1)大,如果可以把a(i)换为比a(i-1)大的数,break;若不可以continue }                                                    

接下来进行细节的分析:

如何判断"a(i)是否可以比a(i-1)小"和“a(i)是否可以比a(i+1)大”?

要从其第一位比起

对于前者相对复杂:

1.当他们都为个位数,只要a(i-1)!=0,a(i)就可以换为0达到破坏效果

2.当他们为多位数,若a(i-1)第一位不为1,a(i)就可以换为1达到破坏效果;若是1,看a(i)对应的哪一位数字,若不为1,break(无法达到破坏条件),若也为1,继续下一位的比较。后面的比较过程和前面类似,但1要换为0,原因是对于多位数首位不能为0,因此首位比较只能用1。

对于后者相对简单:

只需每位依次进行比较,若a(i+1)第一位不为9,a(i)就可以换为9达到破坏效果;若是9,看a(i)对应的哪一位数字,若不为9,break(无法达到破坏条件),若也为1,继续下一位的比较。后面的比较过程和前面类似

为什么是1和9?  .

因为题中说明所以满足的解都给通过,我们的1和9是用的最极端方法,只需让其满足,而不用求得最优解。

下面放上源码深入了解下:

import java.io.*;
public class Main {static StreamTokenizer r;static PrintWriter pr;static BufferedReader re;static {r = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));pr = new PrintWriter(new OutputStreamWriter(System.out));re = new BufferedReader(new InputStreamReader(System.in));}static long e[] = new long[120];static boolean flag = false;public static void main(String[] args) throws IOException {int length = ini();long cord[] = new long[length + 2];for (int i = 1; i < cord.length - 1; i++) {cord[i] = longi();}e = cord.clone();for (int i = 1; i < cord.length - 1; i++) {if (!flag) {if (i == 1) {right(cord[i], cord[i + 1], i);} else if (i == cord.length - 2) {left(cord[i - 1], cord[i], i);} else {left(cord[i - 1], cord[i], i);if (!flag) {right(cord[i], cord[i + 1], i);}}}}if (flag) {for (int i = 1; i < e.length - 1; i++) {System.out.print(e[i] + " ");}} else {System.out.println("impossible");}}static void right(long a, long b, int ii) {char[] aa = String.valueOf(a).toCharArray();char[] bb = String.valueOf(b).toCharArray();if (aa.length != bb.length) return;for (int i = 0; i < aa.length; i++) {if (bb[i] == '9') {if (aa[i] == '9') {continue;} else {break;}} else {aa[i] = '9';flag = true;break;}}e[ii] = Long.parseLong(String.valueOf(aa));}static void left(long a, long b, int ii) {char[] aa = String.valueOf(a).toCharArray();char[] bb = String.valueOf(b).toCharArray();if (aa.length != bb.length) return;if (aa.length == 1) {if (aa[0] != '0') {flag = true;bb[0] = '0';}} elsefor (int i = 0; i < aa.length; i++) {if (i == 0) {if (aa[i] == '1') {if (bb[i] == '1') {continue;} else {break;}} else {bb[i] = '1';flag = true;break;}} else {if (aa[i] == '0') {if (bb[i] == '0') {continue;} else {break;}} else {bb[i] = '0';flag = true;break;}}}e[ii] = Long.parseLong(String.valueOf(bb));}static int ini() throws IOException {r.nextToken();return (int) r.nval;}static long longi() throws IOException {r.nextToken();return (long) r.nval;}}

细节问题:

我在解题中遇到了一些情况,在统计位数时我是把数字先转为String在转为char数组;

最开始交的时候发现系统一直在报数组越位的问题;找了一段时间才发现了问题

原因在这一段:

 if (aa.length == 1) {if (aa[0] != '0') {flag = true;bb[0] = '0';}}

开始因为马虎写成了bb[0]=0;这样导致的结果就是char数组直接为空,index为0,导致了数组越位异常,希望大家引以为戒,不要踩坑。

代码中还有一些地方

length+2,是为了首尾两个数考虑,方便避免数组出现越位情况。

另外就是注意数据范围,此处要用long

关于本题大致就介绍到这里了,如果有疑问或更好的想法欢迎在评论区留言交流!!!

Array of Discord牛客网竞赛题解相关推荐

  1. 牛客网7-教417题解

    题目大意 各个位只含4和7的数(比如74777,47,4444),要求各位之和等于n.求其中最小的那个.如果不存在,则输出"YingYingYing". 题目思考 贪心:7的个数越 ...

  2. python刷题 NOI题库 python题解 洛谷、牛客网、AcWing 刷题等

    NOI题库 python题解-2022.01.07整理(1.1-1.3) NOI题库 python题解-2022.01.07整理(1.1-1.3)_dllglvzhenfeng的博客-CSDN博客 N ...

  3. 牛客网笔试真题 2021 阿里巴巴编程题(4星)题解(1-5)

    2021阿里巴巴校招笔试真题_Java工程师.C++工程师_牛客网 1.小强现在有n个物品,每个物品有x,y两种属性和.他想要从中挑出尽可能多的物品满足以下条件:对于任意两个物品 i 和 j ,满足( ...

  4. JavsScript牛客网华为机试(11-20)题解

    牛客网华为机试题解JavaScript版本 华为机试第11-20题解答(js) 11.数字颠倒 12.字符串反转 13.句子逆序 14.字符串排序 15.求int型数据在内存中存储时1的个数 16.购 ...

  5. JavaScript_牛客网_编程初学者入门训练(21-30题解)

    牛客网编程初学者入门训练题解JavaScript版本 编程初学者入门训练第21-30题解答(js) 22.你能活多少秒 25.计算体重指数 26.计算三角形的周长和面积 27.计算球体体积 28.大小 ...

  6. 牛客网sql练习题解(22-32)

    文章目录 简介 NO.22 NO.23 NO.24 NO.25 NO.26 NO.27 NO.28 NO.29 NO.30 NO.31 NO.32 简介 往期文章: 牛客网sql练习题解 (1-11) ...

  7. 牛客网sql练习题解(12-21)

    文章目录 简介 NO.12 NO.13 NO.14 NO.15 NO.16 NO.17 NO.18 NO.19 NO.20 NO.21 简介 按时来更,感觉题目不是很难,不过我有一个感觉就是虽然题目简 ...

  8. JavaScript_牛客网_编程初学者入门训练(131-140题解)

    牛客网编程初学者入门训练题解JavaScript版本 编程初学者入门训练第131-140题解答(js) 131.KiKi学程序设计基础 132.KiKi算期末成绩 133.KiKi说祝福语 134.K ...

  9. 题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)

    前言 比赛的时候没学过SG函数的蒟蒻以为是道结论题,但是不是QwQ 和dummyummy巨佬一起推了快三个小时的规律 最后去问了真正的巨佬__stdcall __stdcall面带微笑的告诉我们,这是 ...

最新文章

  1. python读取大文件-Python如何读取、拆分大文件
  2. 19行代码AC——例题 6-2 铁轨(Rails, UVa 514)——解题报告
  3. [Python技巧]是时候用 defaultdict 和 Counter 代替 dictionary 了
  4. JS事件 卸载事件 当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。注意:不同浏览器对onunload事件支持不同。...
  5. 逆向研究QCA9563固件,查看和修改GPIO定义
  6. GIS基础软件技术体系发展及展望
  7. 股票交易软件接口编程语言
  8. KHV0031-himall3.0商城异常类(一)
  9. 2022年计算机二级WPS Office高级应用与设计复习题及答案
  10. 万年历程序例题(农历阴历转换)
  11. 使用window.close()关闭标签页的注意事项
  12. Excise_day04Array
  13. Kubernetes集群部署之二CA证书制作
  14. 刘彬20000词汇05
  15. Casbin明日之星预选生计划-Talent for Casbin 2021(长期招聘)
  16. 10053 事件详解
  17. Innodb中聚簇索引
  18. python统计分析方法
  19. poi和easyExcel基于Java操作Excel学习笔记
  20. mininet构建双路由器实验

热门文章

  1. 基于web的智慧养老平台
  2. npm包的发布-官网发布(一)
  3. 有关python方面的论文题目_有关的论文题目
  4. ios学习笔记3--导航控制器详解
  5. Springboot 对接容联短信服务报错
  6. Adobe Magento 2 最新认证证书考前准备,考试过程和注意事项
  7. Python 数据结构之元组
  8. JAVA计算机毕业设计茶店订购管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  9. 设计世界中的阴阳:带有微妙文字的强大英雄形象
  10. 现在的微信营销技巧都有哪些呢?