Luogu P1106 貪欲な削除問題 + ダブルポインタ

タイトル 説明
キーボードから高精度の正の整数 �� N (250250 桁以内) を入力し その中の�� k の数値を削除すると、残りの数値が元の左と左の新しい非負の整数を形成します。正しい順序。プログラミング 与えられた � N および � k に対して、残りの数値によって形成される新しい数値を最小化する解を見つけます。
入力形式
正の整数を2行入力します。
最初の行は、高精度の正の整数 � n
2 行目に 、削除する数値の数を示す正の整数 � k を入力します。
出力形式は
、最後に残った最小の数値である整数を出力します。
入力 出力サンプル
入力 #1 コピー
175438 4
出力 #1 コピー
13

ポータル: P1106 削除の問題

質問の解決策を読んだところ、貪欲+ダブルポインタで書かれていないようなので、この記事を持っています(こんにちは)

これが Konjac の最初の解決策です。

N が n 桁であると仮定し、そのうちの k 桁を削除すると、タイトルは次のように変換できます。番号の順序が変わらないという条件で、n 桁に (nk) 桁を保持します。

最終的な数値をできるだけ小さくするには、上位の数値をできるだけ小さくし、p1、p2 を使用して検索間隔をマークし、その間隔内の最小値をシーケンスとして見つけます。

検索数をできるだけ少なくするために、検索間隔をできるだけ大きくし、検索間隔の左端点 p1=1 を設定し、p2 の設定をできるだけ遅くする必要があります。同時に、十分な数の数値 (nk ) が見つかることを確認するため、p2 の初期設定は n-(nk)+1、つまり k+1 番目のビットになります。

たとえば、N=190363、k=3 の場合、最初の p1=1 となるため、p2=4 は下位を確保するために 2 桁を予約し、1 桁目と 4 桁目の間の数値を見つけて、最小値を最高値として選択します。結果の桁、明らかに 3 番目のビット 0 です; p1=3+1=4 を更新し、次に 2 ビットを見つける必要があるため、p2 を後方に移動し、p2+=1 を 5 に更新し、4 番目から 5 番目を検索しますビット、最小値は 4 番目のビット 3 ; p1=4+1=5 を更新、p2+=1 は 6、5 ~ 6 桁目を検索、最小値は 3; 3 回検索した後、033 を取得します。先頭の 0 を削除すると、結果は 33 になります。

終わり!

#include<stdio.h>
#include<string.h>
int main(){
    char ch[260]={0};
    int key[260]={0};//记录答案
    int k,i,p1,p2,p;
    scanf("%s%d",ch+1,&k);
    int len=strlen(ch+1);
    for(p1=1,p2=k+1,p=0;p<len-k;p++){//一次查找一位
        int temp=9;//temp最终为当前查找区间内的最小值
        for(i=p1;i<=p2;i++){
            if(ch[i]-'0'<temp)temp=ch[i]-'0';            
        }
        key[p]=temp;
        for(i=p1;;i++){
            if(ch[i]-'0'==temp){
                p1=i+1;    
                break;
            }
        }
        p2++;
    }
    int sum=0;
    for(i=0;i<p;i++){
        sum=sum*10+key[i];    
    }
    printf("%d",sum);
    return 0;
}    

おすすめ

転載: blog.csdn.net/Cat_ind/article/details/129214405