题意:给定一个数字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(贪心,搜索)的更多相关文章

  1. 【NLP】选择目标序列:贪心搜索和Beam search

    构建seq2seq模型,并训练完成后,我们只要将源句子输入进训练好的模型,执行一次前向传播就能得到目标句子,但是值得注意的是: seq2seq模型的decoder部分实际上相当于一个语言模型,相比于R ...

  2. 集束搜索beam search和贪心搜索greedy search

    贪心搜索(greedy search) 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search) 集束搜索可以认为是维特比算法的贪心形式,在维特 ...

  3. [DeeplearningAI笔记]序列模型3.2有条件的语言模型与贪心搜索的不可行性

    5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.2选择最可能的句子 Picking the most likely sentence condition lan ...

  4. 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)

    科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...

  5. noip 2010 引水入城 贪心 + 搜索

    不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的.否则,中间那些没被覆盖的部分永远都不能被覆盖到. 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的.我们可以开一 ...

  6. CF508E (贪心+搜索+构造)

    题目大意:让你构造一个括号序列,括号匹配的方式类似于栈,给出从左数每个括号 到和它匹配的右括号的 最小和最大距离,让你输出一个合法括号序列 看错题了以为是二分图,然后写了搜索 贪心发现如果距离往小了填 ...

  7. HDU 5527---Too Rich(贪心+搜索)

    题目链接 Problem Description You are a rich person, and you think your wallet is too heavy and full now. ...

  8. 2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)

    传送门 原来一直以为是一道大模拟. 没想到是一道搜索+最优性剪枝 如何搜最优呢? 我们考虑怎么最快出完. 大概是应该尽量出当前能出出去最多的吧. 于是我们选择优先出顺子. 这样做有什么好处呢? 我们会 ...

  9. CF1155D Beautiful Array 贪心,dp

    CF115DBeautiful Array 题目大意:给一个有n个元素的a数组,可以选择其中一个区间的所有数都乘上x,也可以不选,求最大子序列和. 如果没有前面的操作,就是只求最大子序列和,我们都知道 ...

  10. CodeForces 651B Beautiful Paintings 贪心

    A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

随机推荐

  1. SAP产品的Field Extensibility

    SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准).这些产品标准,包含在SAP项目实施中大显 ...

  2. Android(java)学习笔记140:常用的对话框

    一.常见对话框属性: 1. AlertDialog.Builder属性  • setTitle: 为对话框设置标题 :• setIcon : 为对话框设置图标:• setMessage: 为对话框设置 ...

  3. 模板类 vector

    概要 介绍一下模板类 vector 的常用操作,以及一个应用举例,顺时针打印矩阵.   基本定义 模板类 vector 是一种动态数组,它是使用 new 创建动态数组的替代品,实际上,vector 也 ...

  4. Python基础篇 -- 部分练习题

    实现一个整数加法计算器(两个数相加): 如:content = input("请输入内容:") 用户输入:5+9或5+ 9或5 + 9(含空白),然后进行分割转换最终进行整数的计算 ...

  5. SniperOJ-leak-advanced-x86-64

    借助DynELF实现无libc的漏洞利用小结 1.leak-advance与leak的区别在于一个可用函数是write,一个可用函数是puts.write比puts更容易利用,虽然write需要的参数 ...

  6. Dev-Cpp 5.11 c++编译器下载

    Dev-Cpp 5.11 c++编译器下载地址: 链接: https://pan.baidu.com/s/1jHMAf1k 密码: i6nw

  7. 长链剖分优化dp三例题

    首先,重链剖分我们有所认识,在dsu on tree和数据结构维护链时我们都用过他的性质. 在这里,我们要介绍一种新的剖分方式,我们求出这个点到子树中的最长链长,这个链长最终从哪个儿子更新而来,那个儿 ...

  8. Watch Before You Feel Pressure

    Today's assembly is about the start of a journey. 今天的大会是一个旅程的开始. The start of the rest of your lives ...

  9. mybatis 批量操作增删改查

    在介绍批量操作之前,首先先介绍一个语法:foreach.可以说是,foreach是整个批量操作的灵魂. 属性 描述 item 循环体中的具体对象. 支持属性的点路径访问,如item.age,item. ...

  10. Linux菜鸟起飞之路【四】绝对路径、相对路径及常用目录

    一.绝对路径与相对路径 Linux操作系统中存在着两种路径:绝对路径和相对路径.我们在访问文件或文件夹的时候,其实都是通过路径来操作的.两种路径在实际操作中能起到同等的作用. 在开始具体介绍之前,我们 ...