题解 洛谷P6387 【[COCI2007-2008#4] VECI】
一、目录概览
一、目录概览
二、题目大意
三、本题思路
四、简单介绍_Permutation
五、代码剖析
二、题目大意
这道题目的意思可以转换为:
用0~9若干个数码,可以组成一些自然数,目标是在这些自然数中找出比X大的最小值。
三、本题思路
这道题目,如果学过STL中的Permutation,就能够轻松解决。如果没学过,可以看第四区。
搜到X以后,输出X的后一个,如果X已经是最后一个了,那么输出0。
建议全排列时使用整形,字符能不能过编译?Emmm没试过。
四、简单介绍_Permutation
如果您是大佬,那么,请跳过本区。
C++算法头文件Algorithm中提供了从小到大、从大到小两种全排列函数,核心算法实现类似于sort(快速排序):
next_permutation(v.begin(),v.end());
prev_permutation(v.begin(),v.end());
另外,此函数还具有自动去重的功能。
如果您是耐心地看到了这里,那么您应该已经会做了,但是,为了帮助萌新(即菜鸟,又称蒟蒻),那么可以继续看代码,代码中有详细的注释哦。
五、代码解析
防盗水印,请见谅。
- #include<bits/stdc++.h>//大力推荐万能头 - using namespace std;//名字空间 - int main()//开始吧 - { - register string X;//输入进来用string - register int Length;//字符串长度 - register int i;//循环变量 - register bool Flag=false;//是否找到了X - register int Array[11];//转化为整形 - cin>>X;//扫描字符串 - Length=X.size();//字符串长度 - for(i=0;i<Length;i++) - { - Array[i]=X[i]-'0';//化为整形,处理更香 - } - do - { - if(Flag)//如果前一个是X - { - for(i=0;i<Length;i++) - { - cout<<Array[i];//输出答案 - } - cout<<endl;//莫忘换行 - return 0;//结束程序 - } - bool Now=true;//看看当前状态和X是否相符 - for(i=0;i<Length;i++) - { - if(Array[i]!=X[i]-'0')//如果某一位不同 - { - Now=false;//那么不是X - break;//跳出循环 - } - } - if(Now)//如果已经找到了X - { - Flag=true;//那么为下一个做好标记 - } - } - while(next_permutation(Array,Array+Length));//全排列函数 - cout<<0<<endl;//无解 - return 0;//完美结束 - }
不要妄图追上西坠的太阳,而是要在黎明前就等着它!
浙公网安备 33010602011771号