hdu 3183 A Magic Lamp(模拟解法)

来源:互联网 发布:淘宝中老年新款女秋装 编辑:程序博客网 时间:2024/05/16 07:36

思路见代码,递归写法很容易懂。

证明:反证。


/*    author:ray007great    version:1.0*/#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<set>#include<map>#include<string>#include<time.h>#include<queue>using namespace std;typedef long long ll;//c++#pragma comment(linker, "/STACK:102400000,102400000")// g++//int size = 256 << 20; // 256MB//char *p = (char*)malloc(size) + size;//__asm__("movl %0, %esp\n" :: "r"(p) );#define sf(a) scanf("%d",&a)#define sfs(a) scanf("%s",a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define repd(i,a,b) for(int i=(a);i>=(b);i--)#define rep1(i,a,b) for(int i=(a);i<(b);i++)#define clr(a) memset(a,0,sizeof(a))#define clr1(a) memset(a,-1,sizeof(a))#define pfk  printf("fuck\n")/*  define *//* clock  *///clock_t start, finish;//start = clock();//finish = clock();//double duration = (double)(finish - start)/CLOCKS_PER_SEC;//printf( "%.10f seconds\n", duration );/* clock *//* data *//* data */string str,ans,res1,res2;int k;void del1(int l,int r);void del2(int l,int r);void del2(int l,int r){    if(k==0||res2=="") return;    for(int i=l;i<r;i++){        if(res2[i]>res2[i+1]){            res1="";            for(int j=l;j<=r;j++){                if(j==i) continue;                res1+=res2[j];            }            k--;            del1(0,r-1);            return ;        }    }    return ;}void del1(int l,int r){    if(k==0||res1=="") return ;    for(int i=l;i<r;i++){        if(res1[i]>res1[i+1]){            res2="";            for(int j=l;j<=r;j++){                if(j==i) continue;                res2+=res1[j];            }            k--;            del2(0,r-1);            return ;        }    }    return ;}bool isDel[2500];int main(){    while(cin>>str){        cin>>k;        res1="";res2="";        for(int i=0;str[i];i++) res1+=str[i];        ans="";        del1(0,str.length()-1);        int len1=res1.length();        int len2=res2.length();        if(len1<=len2||(len1&&!len2)){            for(int i=0;i<len1;i++)                ans+=res1[i];        }        else {            for(int i=0;i<len2;i++)                ans+=res2[i];        }        int len=ans.length();        clr(isDel);        for(int i=len-1;i>=0;i--){            if(k==0) break;            isDel[i]=true;            k--;        }        int flag=0;        for(int i=0;ans[i];i++){            if(isDel[i]) continue;            if(ans[i]=='0'&&!flag) continue;            flag=1;            cout<<ans[i];        }        if(!flag) cout<<0;        cout<<endl;    }    return 0;}


原创粉丝点击