题解 洛谷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;//完美结束
- }
View Code

 

posted @ 2020-08-08 15:01  Bushuai_Tang  阅读(189)  评论(0编辑  收藏  举报