【HDOJ6351】Beautiful Now(贪心,搜索)
题意:给定一个数字n,最多可以交换其两个数位k次,求交换后的最大值与最小值,最小值不能有前导0
n,k<=1e9
思路:
当k>=n的位数时只需要无脑排序
k<n时有一个显然的贪心是从高位到低位,如果当前位置不是可取的最值的话就从比现在低的位置挑一个最值换上来
问题在于可能有多个低位上的数字相同,而且这个问题没有正确的贪心策略
所以只能记录下它们的位置,依次搜索
搜索最小值时第一位不能是0
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<cmath>
- #include<iostream>
- #include<algorithm>
- #include<map>
- #include<set>
- #include<queue>
- #include<vector>
- using namespace std;
- typedef long long ll;
- typedef unsigned int uint;
- typedef unsigned long long ull;
- typedef pair<int,int> PII;
- typedef vector<int> VI;
- #define fi first
- #define se second
- #define MP make_pair
- #define N 11000000
- #define MOD 1000000007
- #define eps 1e-8
- #define pi acos(-1)
- ll f[],mx,mn;
- int a[],b[],K,len;
- void dfs1(ll n,int s,int k)
- {
- //printf("%lld %d %d\n",n,s,k);
- mn=min(mn,n);
- mx=max(mx,n);
- if(s==len) return;
- if(k==K+) return;
- int flag=;
- for(int i=s+;i<=len;i++)
- if(b[i]<b[s+]) {flag=;break;}
- if(flag)
- {
- dfs1(n,s+,k);
- return;
- }
- int c[];
- int now=b[s+];
- int m=;
- for(int i=s+;i<=len;i++)
- {
- if(b[i]<now)
- {
- m=;
- c[]=i;
- now=b[i];
- continue;
- }
- if(b[i]==now) c[++m]=i;
- }
- //printf("%d %d\n",m,c[m]);
- if(k==&&s==&&m>&&b[c[m]]==)
- {
- m=; now=b[];
- for(int i=;i<=len;i++)
- {
- if(b[i]==) continue;
- if(b[i]<now)
- {
- m=;
- c[]=i;
- now=b[i];
- continue;
- }
- if(b[i]==now) c[++m]=i;
- }
- }
- for(int i=;i<=m;i++)
- {
- int t=c[i];
- ll tmp=n+f[len-s-]*(b[t]-b[s+])+f[len-t]*(b[s+]-b[t]);
- swap(b[s+],b[t]);
- dfs1(tmp,s+,k+);
- swap(b[s+],b[t]);
- }
- dfs1(n,s+,k);
- }
- void dfs2(ll n,int s,int k)
- {
- //printf("%lld %d %d\n",n,s,k);
- mn=min(mn,n);
- mx=max(mx,n);
- if(s==len) return;
- if(k==K+) return;
- int flag=;
- for(int i=s+;i<=len;i++)
- if(b[i]>b[s+]) {flag=;break;}
- if(flag)
- {
- dfs2(n,s+,k);
- return;
- }
- int c[];
- int now=b[s+];
- int m=;
- for(int i=s+;i<=len;i++)
- {
- if(b[i]>now)
- {
- m=;
- c[]=i;
- now=b[i];
- continue;
- }
- if(b[i]==now) c[++m]=i;
- }
- for(int i=;i<=m;i++)
- {
- int t=c[i];
- ll tmp=n+f[len-s-]*(b[t]-b[s+])+f[len-t]*(b[s+]-b[t]);
- swap(b[s+],b[t]);
- dfs2(tmp,s+,k+);
- swap(b[s+],b[t]);
- }
- dfs2(n,s+,k);
- }
- int read()
- {
- int v=,f=;
- char c=getchar();
- while(c<||<c) {if(c=='-') f=-; c=getchar();}
- while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
- return v*f;
- }
- void swap(int &x,int &y)
- {
- int t=x;x=y;y=t;
- }
- int main()
- {
- freopen("1.in","r",stdin);
- freopen("1.out","w",stdout);
- f[]=;
- for(int i=;i<=;i++) f[i]=f[i-]*;
- int cas;
- scanf("%d",&cas);
- while(cas--)
- {
- int n;
- scanf("%d%d",&n,&K);
- len=;
- int t=n;
- while(t)
- {
- b[++len]=t%;
- t/=;
- }
- for(int i=;i<=len/;i++) swap(b[i],b[len-i+]);
- if(K>=len)
- {
- for(int i=;i<=;i++) a[i]=;
- int t=n;
- while(t)
- {
- a[t%]++;
- t/=;
- }
- for(int i=;i<=;i++)
- if(a[i]){a[i]--; printf("%d",i); break;}
- for(int i=;i<=;i++)
- for(int j=;j<=a[i];j++) printf("%d",i);
- printf(" ");
- for(int i=;i<=;i++) a[i]=;
- t=n;
- while(t)
- {
- a[t%]++;
- t/=;
- }
- for(int i=;i>=;i--)
- for(int j=;j<=a[i];j++) printf("%d",i);
- printf("\n");
- continue;
- }
- mn=mx=n;
- dfs1(n,,);
- dfs2(n,,);
- printf("%d %d\n",mn,mx);
- }
- return ;
- }
【HDOJ6351】Beautiful Now(贪心,搜索)的更多相关文章
- 【NLP】选择目标序列:贪心搜索和Beam search
构建seq2seq模型,并训练完成后,我们只要将源句子输入进训练好的模型,执行一次前向传播就能得到目标句子,但是值得注意的是: seq2seq模型的decoder部分实际上相当于一个语言模型,相比于R ...
- 集束搜索beam search和贪心搜索greedy search
贪心搜索(greedy search) 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search) 集束搜索可以认为是维特比算法的贪心形式,在维特 ...
- [DeeplearningAI笔记]序列模型3.2有条件的语言模型与贪心搜索的不可行性
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.2选择最可能的句子 Picking the most likely sentence condition lan ...
- 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)
科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...
- noip 2010 引水入城 贪心 + 搜索
不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的.否则,中间那些没被覆盖的部分永远都不能被覆盖到. 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的.我们可以开一 ...
- CF508E (贪心+搜索+构造)
题目大意:让你构造一个括号序列,括号匹配的方式类似于栈,给出从左数每个括号 到和它匹配的右括号的 最小和最大距离,让你输出一个合法括号序列 看错题了以为是二分图,然后写了搜索 贪心发现如果距离往小了填 ...
- HDU 5527---Too Rich(贪心+搜索)
题目链接 Problem Description You are a rich person, and you think your wallet is too heavy and full now. ...
- 2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)
传送门 原来一直以为是一道大模拟. 没想到是一道搜索+最优性剪枝 如何搜最优呢? 我们考虑怎么最快出完. 大概是应该尽量出当前能出出去最多的吧. 于是我们选择优先出顺子. 这样做有什么好处呢? 我们会 ...
- CF1155D Beautiful Array 贪心,dp
CF115DBeautiful Array 题目大意:给一个有n个元素的a数组,可以选择其中一个区间的所有数都乘上x,也可以不选,求最大子序列和. 如果没有前面的操作,就是只求最大子序列和,我们都知道 ...
- CodeForces 651B Beautiful Paintings 贪心
A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
随机推荐
- UVALive 4080 Warfare And Logistics (最短路树)
很多的边会被删掉,需要排除一些干扰进行优化. 和UVA - 1279 Asteroid Rangers类似,本题最关键的地方在于,对于一个单源的最短路径来说,如果最短路树上的边没有改变的话,那么最短路 ...
- firstElectron_web5 安装
小娜 搜 cmd 右键 管理员运行 1.装全局 这样 不用每次都下载 因为包挺大的 还有用cnpm 要不太慢 cnpm install electron --save-dev --save-exact ...
- kitti raw data development kit的使用
run_demoVelodyne.m使用:http://blog.csdn.net/qq_33801763/article/details/78959205 https://www.cnblogs ...
- javaEE(5)_Cookie和Session
一.会话 1.什么是会话?会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.类似打电话一样.2.会话过程中要解决的一些问题?每个用户 ...
- Spring根据XML配置文件注入属性 其实也是造bean,看看是使用constructor还是setter顺带完成属性赋值
方法一使用setter方法 package com.swift; public class Book { private String bookName; public void setBook(St ...
- Git学习之路
目录 git安装 linux windows git命令 创建版本库 提交文件 仓库状态 版本回退 工作区和暂存区 工作区 暂存区 推送.下拉和克隆 推送 下拉 克隆 git应该可以说是程序员必备技能 ...
- GIMP图像窗口的自定义
具体功能包含:初始缩放比例.空格键按下时触发动作
- python 中requests 模块用py2exe生成exe后SSL certificate exception的问题
[('system library', 'fopen', 'No such process'), ('BIO routines', 'BIO_new_file', 'no such file'), ( ...
- 一次下载多个文件的解决思路-JS
一次下载多个文件的解决思路(iframe) - Eric 真实经历 最近开发项目需要做文件下载,想想挺简单的,之前也做过,后台提供下载接口,前端使用window.location.href就行了呗.不 ...
- IE6,7,8,9还有火狐浏览器的兼容
/*FF.Opear等支持Web标准的浏览器*/#header { margin-top: 23px; margin-bottom: 23px;}/*IE6浏览器*/*ht ...