UPC-ラッキーナンバー
タイトル説明
ファーマージョンまもなく誕生日は、牛は彼に贈り物を送りたいです。予算不足のため、牛はデジタル媒体に愛ファーマージョンの糧にしようとしています。牛は0-9 10桁の数のサブセットであるM(1≤M≤10)ヶ月を、持っているファーマージョンは不吉な数を考えたことを知っています。一人一人がファーマージョン正先行ゼロなしの数、およびは不吉な数を考えた場合、この番号はラッキーナンバーです。
考慮ファーマージョンの誕生日が一日であるn個の農場を確立するために、牛は超えないラッキーナンバーを生成したいのn、nは、この数mと最も近い、ファーマージョンにそれを与えます。彼らはこのギフトがあり、ヘルプ計算するにはあなたを求めるので、牛は、期待nは大きすぎるしませんでした。
エントリー
二つの入力ラインを含む、最初の行は2つの整数を含んでいるnおよびm
はそれぞれ0〜9の数であり、2行目はm個の整数を含みます。これは、データ互いに異なる整数mを確保することです
輸出
唯一の行、すなわち、nがラッキーの最大数を超えない
ない溶液、出力A場合は-1
サンプル入力
2019年2
1 9
サンプル出力
1999
これは問題の元のソースであり、海淀区、第三のクラスのプログラミング思考知恵カップ準決勝(C ++)
汚職の圧力と再帰の問題点へのオリジナルソリューションは、我々は全体を理解していませんでした。彼はまだ自分自身を作りました
私はあなたが、私はそれのコンテンツの私の解釈を更新するには、この時間がかかるので、私は、ブログが非常に混同されて書いてみましょう聞い..................
最初のオファーが彼らの貪欲プラスアナログジャンクコード(私は説明を見たいです)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char u[100005],save[11],ans[100005];
bool cmp(char a,char b) {
return a>b;
}
int main() {
int num;
cin>>u;
cin>>num;
for(int i=0; i<num; i++)
cin>>save[i];
sort(save,save+num,cmp);
int l=strlen(u);
if(num==1&&save[0]=='0') {
cout<<"-1"<<endl;
return 0;
}
int i;
for(i=0; i<l; i++)
ans[i]=save[0];
for(i=0; i<l; i++) {
if(ans[i]==u[i])
continue;
if(ans[i]<u[i]) {
int j=0;
if(ans[j]=='0')
j++;
if(j>=l)
{
cout<<"-1"<<endl;
return 0;
}
for(; j<=i; j++)
putchar(ans[j]);
for(int j=i+1; j<l; j++)
putchar(save[0]);
cout<<endl;
return 0;
}
int temp=0;
while(ans[i]>u[i]) {
if(temp>num-1)
goto A;
ans[i]=save[temp++];
}
i--;
}
cout<<ans<<endl;
return 0;
A:
for(int j=i-1; j>=-1; j--) {
if(j==-1) {
l--;
if(!l) {
cout<<-1<<endl;
return 0;
}
for(i=0; i<l; i++)
putchar(save[0]);
putchar('\n');
return 0;
}
if(ans[j]==save[num-1])
continue;
if(ans[j]!=save[num-1]) {
for(int k=0; k<num; k++)
if(ans[j]==save[k]) {
ans[j]=save[k+1];
for(int z=0; z<=j; z++)
putchar(ans[z]);
for(int z=j+1; z<l; z++)
putchar(save[0]);
putchar('\n');
return 0;
}
}
}
}
OK、貪欲なアイデアは、彼が戸口で刺したペンも見ることができますを取るということです。
次のプロの花の家の要件に応じて、何をすべきか説明;
次のように最初に全体的なアイデアがある:
1、あなたは最大(最大値が真ではなく、最高の最大)を埋めることができます最初の場合
PS:次番号と元の数意味は、すべての番号に相当する。ということことである
元の数よりも1桁小さいがある場合2、背面にフロントは、すべてこの後、次に数が最大数である
3は、もし数よりも元の数大きな、その後に充填すべての数字が最も大きいオリジナルのデジタル数字よりも大きくなることはできません彼を失望させ。あなたが達成できない場合には、王Qianmianは、デジタル数が最小に充填されていませんがあるかどうかを見つけます。その後、私たちはしている場合、ビット数の削減(あなたはこのBEは、充填の数を減らすためにダウン満たさせることができない場合は、最小数のため)、すべての残りの部分は、最大出力の数値に充填することができます。
4、唯一の1つの数字、0をリード可能なシナリオの出現がある場合は、特別な配慮!
次にアイデアを、次のステップは、純粋なシミュレーションです。少し複雑シミュレートするので、ストローク明確な思考に必ず、混乱しません!
バイ・ホイール月