2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造

题意:

给你n个小于101810^{18}1018的大数,问在可以再不改变序列位置,之改变数值中某数位的‘9’变为‘6’或将‘6’变为‘9’,求的最终序列由小到大,且字典序最小。

题目:

链接:https://ac.nowcoder.com/acm/contest/16741/H
来源:牛客网
Woe is you – for your algorithms class you have to write a sorting algorithm, but you missed the relevant lecture! The subject was in-place sorting algorithms, which you deduce must be algorithms that leave each input number in its place and yet somehow also sort the sequence.

Of course you cannot change any of the numbers either, then the result would just be a difffferent sequence. But then it hits you: if you flflip a 6 upside-down, it becomes a 9, and vice versa! Certainly no one can complain about this since you changed none of the digits! The deadline to hand in the exercise is in fifive hours. Try to implement this sorting algorithm before then!

输入描述:

The input consists of:
• A line with an integer n (2 ≤ n ≤ 10 000), the number of integers in the input sequence.
• n lines, the ith of which contains a positive integer xi (1 ≤ xi ≤ 1018), the ith number of the sequence.

输出描述:

If the sequence cannot be sorted non-decreasingly by flipping some number 6 or 9 in input 1, output “not possible”. Otherwise, output “possible” followed by the sorted sequence - each number on its own line.
If there is more than one valid solution, please output the smallest sequence.

示例1

输入

4
9
7
7
9

输出

possible
6
7
7
9

示例2

输入

4
97
96
66
160

输出

possible
67
69
69
160

示例3

输入

3
80
97
79

输出

impossible

示例4

输入

2
197
166

输出

possible
167
169

分析:

是一道比较容易的题,但比赛时考虑太多,wa了十几遍。。。下来看题解,有点想吐血在这里插入图片描述
废话不多说了,下面看分析:

  • 贪心构造,使每个串在大于等于前一个串的前提下尽可能小。注意字符串之间的大小比较与数字之间大小比较的不同(以字符串形式输入数字)。
    依次遍历n个串,分情况构造:
    1. 当前串长度 > 前一个串长度。那直接把当前串的所有9变成6就可以了,变完之后当前串肯定还是大于前一个串。
    2. 当前串长度 < 前一个串长度。就算把当前串的所有6变成9也无力回天了,直接impossible结束。
    3. 当前串长度 = 前一个串长度。先还是把当前串的所有6变成9,如果还是比前一个串小,直接impossible结束;否则,从高位到低位,依次尝试把9变回6,这个时候要注意,如果变了之后比前一个串小了,那就说明不能变,一定要还原回去!

AC代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int M=1e4+10;
string a[M];
int n;
bool solve(string f,int ii){if(f.size()>a[ii-1].size()){for(int j=0;j<f.size();j++)if(f[j]=='9')f[j]='6';a[ii]=f;}else{if(f.size()<a[ii-1].size())return 0;for(int i=0;i<f.size();i++)if(f[i]=='6')f[i]='9';if(f<a[ii-1])return 0;for(int i=0;i<f.size();i++){if(f[i]=='9'){f[i]='6';if(f<a[ii-1])f[i]='9';}}a[ii]=f;}return 1;
}
int main(){cin>>n;int vis=0;a[0]="0";for(int i=1;i<=n;i++){cin>>a[i];if(vis==1)continue;if(!solve(a[i],i))vis=1;}if(vis==1) cout<<"impossible"<<endl;else{cout<<"possible"<<endl;for(int i=1;i<=n;i++)cout<<a[i]<<endl;}return 0;
}

想了想还是抛上我比赛时地错误代码:
分析:

  1. 因为我没有分长度判断,所以开了一个函数计算长度为101810^{18}1018的数值,也是够够的,比赛时的确注意到直接比较字符串的字典序,由于长度的问题,会有问题,但是随即的解决方案,搞了这么个吃力不讨好的。
  2. 暴力莽,想着对于所有6和9的出现位置可以先全部更为6,然后进制枚举一下可能性,将6变为9,那么有2182^{18}218种排列,数据量218∗1042^{18}*10^4218104,妥妥的超时…
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<iostream>
using namespace std;
typedef long long ll;
const int M=1e4+10;
string a[M]; 
int b[M];
int n,tot;
ll dfs(string f){ll ans=0;int p=f.size();for(int i=0;i<p;i++){ans=ans*10+f[i]-'0';}return ans;
}
bool solve(string f,int ii){int ans=1<<tot;for(int i=0;i<ans;i++){string w=f;int k=i;int kk=0;while(k>0){if(k%2==1){w[b[tot-1-kk]]='9';}k/=2;kk++;}if(dfs(w)>=dfs(a[ii-1])){a[ii]=w;return true;}}return false;
}
int main(){//while(1){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;int vis=0;a[0]="0";for(int i=1;i<=n;i++){cin>>a[i];tot=0;if(vis==1)continue;string s=a[i];int l=s.size();for(int j=0;j<l;j++){if(s[j]=='6')b[tot++]=j;if(s[j]=='9'){b[tot++]=j;s[j]='6';}}if(!solve(s,i))vis=1;}if(vis==1) cout<<"impossible"<<endl;else{cout<<"possible"<<endl;for(int i=1;i<=n;i++)cout<<a[i]<<endl;}//}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用.NET进行客户端Web开发?看这个Bootstrap风格的BlazorUI组件库

点击上方“Dotnet9”添加关注哦Blazor一、前言今天在下班的路上&#xff08;地铁上&#xff09;&#xff0c;站长习惯性的掏出手机&#xff0c;就收到知乎向站长推送的一篇BlazorUI组件库推荐文章&#xff0c;是码云官方的&#xff1a;原文链接[1]&#xff0c;于是我立即打开码…

2021年度训练联盟热身训练赛第五场F题Group Project

题意&#xff1a; 有n个人&#xff0c;其中有m组&#xff0c;两两互斥&#xff0c;现在要分成两个班&#xff0c;但最终求的确是最多有多少对不互斥的。 题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/16741/F 来源&#xff1a;牛客网 The big day…

[JavaWeb-XML]XML约束概述

约束&#xff1a;规定xml文档的书写规则 * 作为框架的使用者(程序员)&#xff1a;1. 能够在xml中引入约束文档2. 能够简单的读懂约束文档* 分类&#xff1a;1. DTD:一种简单的约束技术2. Schema:一种复杂的约束技术

在Asp.NET Core中如何优雅的管理用户机密数据

在Asp.NET Core中如何优雅的管理用户机密数据背景回顾在软件开发过程中&#xff0c;使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法。在早期VB/VB.NET时代&#xff0c;经常使用.ini文件来进行配置管理&#xff1b;而在.NET FX开发中&#xff0c;我们则倾向…

食物链 POJ - 1182

题目&#xff1a; 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动物都是A,B,C中的一种&#xff0c;但是我们并不知道它到底是哪一种。 有人用两种…

[XML-Jsoup]Jsoup_解析_快速入门

xml常见的解析器&#xff1a; 1. JAXP&#xff1a;sun公司提供的解析器&#xff0c;支持dom和sax两种思想2. DOM4J&#xff1a;一款非常优秀的解析器3. Jsoup&#xff1a;jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

计蒜客 逃生+动态规划

题目&#xff1a; 蒜头君在玩一款逃生的游戏。在一个 nmn \times mnm 的矩形地图上&#xff0c;蒜头位于其中一个点。地图上每个格子有加血的药剂&#xff0c;和掉血的火焰&#xff0c;药剂的药效不同&#xff0c;火焰的大小也不同&#xff0c;每个格子上有一个数字&#xff0…

[XML-Jsoup]Jsoup_对象的使用(Jsoup工具类,Document,Elements,Element,Node)

对象的使用&#xff1a; 1. Jsoup&#xff1a;工具类&#xff0c;可以解析html或xml文档&#xff0c;返回Document* parse&#xff1a;解析html或xml文档&#xff0c;返回Document* parse​(File in, String charsetName)&#xff1a;解析xml或html文件的。* parse​(String ht…

别了,Docker Swarm !你好,K8s !

毫无疑问&#xff0c;Kubernetes已经成为容器编排事实标准。除了已经拥抱Kubernetes的Google、BAT、京东、奇虎360等巨头大厂外&#xff0c;更多的企业也都在向Kubernetes迁移。容器技术大势所趋&#xff0c;是互联网企业目前急需的技术人才之一&#xff0c;已成为运维工程师、…

01背包+概率问题 计蒜客 offer

题目&#xff1a; 蒜头君很早就想出国&#xff0c;现在他已经考完了所有需要的考试&#xff0c;准备了所有要准备的材料&#xff0c;于是&#xff0c;便需要去申请学校了。要申请国外的任何大学&#xff0c;你都要交纳一定的申请费用&#xff0c;这可是很惊人的。蒜头君没有多…

[JavaWeb-XML]XML_解析_解析方式

解析&#xff1a;操作xml文档&#xff0c;将文档中的数据读取到内存中 * 操作xml文档1. 解析(读取)&#xff1a;将文档中的数据读取到内存中2. 写入&#xff1a;将内存中的数据保存到xml文档中。持久化的存储* 解析xml的方式&#xff1a;1. DOM&#xff1a;将标记语言文档一次性…

【翻译】.NET 5 Preview5发布

今天&#xff0c;发布了.NET 5.0 Preview5。主要对它进行了一小部分新功能和性能的改进。.NET 5.0 Preview 4包含了一些计划和.NET 5.0要交付的内容。现在&#xff0c;大多数的功能都已经包含在里面&#xff0c;但是有许多功能还未到最终状态。预计这个版本在Preview 7中完善。…

构造前缀贪心+ 计蒜客 子矩阵求和

题目&#xff1a; 给出一个 nn 行 mm 列的矩阵&#xff0c;矩阵的每个位置有一个非负整数 a[i][j]&#xff0c;有 qq 次询问&#xff0c;每次询问求一个左上角为 (a,b)&#xff0c;右下角为 (c,d) 的子矩阵的所有数之和。 输入格式 第一行两个整数 n,m&#xff0c;表示矩阵的…

[JavaWeb-XML]约束(DTD,Schema)

DTD&#xff1a; * 引入dtd文档到xml文档中* 内部dtd&#xff1a;将约束规则定义在xml文档中* 外部dtd&#xff1a;将约束的规则定义在外部的dtd文件中* 本地&#xff1a;<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">* 网络&#xff1a;<!DOCTYPE 根标签名 …

[跨平台系列三Docker篇]:ASP.NET Core应用

如果你是老张的忠实读者的话&#xff0c;如果是从博客园就开始看我的文章的话&#xff0c;如果后期也一直看我公众号的话&#xff0c;应该就知道其实我一直在根据一条无形的教学线路来讲解的&#xff0c;&#xff0c;如果你真的是想好好学的话&#xff0c;请好好看看我之前的文…

2020牛客国庆集训派对day2 F题 Java大数处理

题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/16913/F 来源&#xff1a;牛客网 The following code snippet calculates the sum of the areas of all the sub rectangular grid in a rectangular grid from (0,0) to (N,N)\ .(N,N) . Find an eff…

[JavaWeb-XML]XML_快捷查询方式(selector选择器,XPath)

快捷查询方式&#xff1a; 1. selector:选择器* 使用的方法&#xff1a;Elements select​(String cssQuery)* 语法&#xff1a;参考Selector类中定义的语法2. XPath&#xff1a;XPath即为XML路径语言&#xff0c;它是一种用来确定XML&#xff08;标准通用标记语言的子集&#…

[壹刊]Azure AD(四)知识补充-服务主体

一&#xff0c;引言又到了新的一周了&#xff0c;也到了我新的分享的时间了&#xff0c;还记得上一周立得Flag&#xff0c;其中 “保证每周输出一篇文章” &#xff0c;让我特别“在意”&#xff08;这里用词不太恰当&#xff09;。主要是我的一个大学舍友&#xff0c;他突然问…

前缀和优化+计蒜客 泡咖啡

题目: 蒜头君想泡咖啡喝。现在他得到了 nn 份菜谱&#xff0c;每个菜谱上都给了两个数l,rl,rl,r代表温度区间在[l,r][l,r][l,r] 度泡出来的咖啡会很好喝。 可是菜谱太多了&#xff0c;蒜头君一度感到疑惑。经过思考之后他得出了一个结论&#xff1a;某个温度只要有 k 份或者更…