吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1397|回复: 5
收起左侧

[讨论] 数字排列CPP题目

[复制链接]
鬼魅王子 发表于 2020-12-20 21:33
给出两个整数 A 和 B,可以重新排列 A 得到新的数字 C (不能有前导 0)。求在小于等于 B 的情况下,C 的最大值是多少。如果不存在输出 -1
输入说明:第一行包含两个整数 A 和 B。 1 <= A, B < 10^9
输出说明:输出符合条件情况下 C 的最大值

输入样例 1
1234 3456
输出样例 1
3421

输入样例 2
10000 5
输出样例 2
-1  
我的思路:
用一个数组储存A的,long long 存B,然后把数字进行全排列,在进行比较,但是觉得这个玩意太费时间了,有没有更好的解决办法找到这个数字?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

小阿华 发表于 2020-12-20 21:44
用两个数组,分别把b和a的个十百千位存入,
b=322,a=125
B[]=3,2,2
A=1,2,5
选出来的肯定是2,
然后找a数组中刚好等于或小于b中最高位的数,然后考虑下一位,再选出刚好等于或小于的,最后在安进程
 楼主| 鬼魅王子 发表于 2020-12-23 13:21
小阿华 发表于 2020-12-20 21:44
用两个数组,分别把b和a的个十百千位存入,
b=322,a=125
B[]=3,2,2

收到了解,我去试试
飘零星夜 发表于 2020-12-23 17:56
首先比较A 和 B 的位数,如果A的位数大于B的位数,由于不能0前导,所以返回-1; //A=5320, B= 999 //A=1234,B=999
如果A的位数小于B的位数,就把A最大排列就好了。//A=1234 B=10000
A的位数 等于 B 的位数,就用二楼的方法
xiaohanzhu 发表于 2021-1-2 15:06
定义数组
字符个别存
例如输入123
a[1]=1,a[2]=2.a[3]=3,
高精度判断
优优酱QAQ 发表于 2021-1-5 15:37
我写的代码,能跑,另外求一下F字幕校对!
[C++] 纯文本查看 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
    //ios::sync_with_stdio(false);
    //cin.tie(nullptr);
    //cout.tie(nullptr);
    char a[20];
	cin>>a;
    LL b;
	cin>>b;
    LL sum=0;
    LL n=strlen(a);
    sort(a,a+n);
    do{
    	next_permutation(a,a+n);
	}while(a[0]=='0');//排除含有前导0的数字排列组合
    for(int i=0;i<n;i++){
    		sum=sum*10+(a[i]-'0');
		}
		 if(sum>b)cout<<-1<<endl;
		else{
			bool flag=0;
		while(next_permutation(a,a+n)){
    	LL ans=sum;
    	sum=0;
    	for(int i=0;i<n;i++){
    		sum=sum*10+(a[i]-'0');
		}
		if(sum>b){
			cout<<ans<<endl;
			flag=1;
			break;
		}
	}
	if(flag==0)cout<<sum<<endl;
	}
    
    
    return 0;
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 10:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表