AtCoder Regular Contest 058 C (水题)

Cこだわり者いろはちゃん / Iroha's Obsession

题意:给定n,k,k个不喜欢的数字,求最小的不出现不喜欢的数字且比n大的值。n<=10000

思路:我分了三种情况讨论。。。但是被学弟bs了。。。范围很小暴力枚举就行了。。。就不用花很多时间了QAQ


/*************************************************************************
     File Name: c.cpp
     ID: obsolescence
     BLOG: http://blog.csdn.net/obsolescence
     LANG: C++ 
     Mail: 384099319@qq.com 
     Created Time: 2016年07月23日 星期六 20时21分57秒
 ************************************************************************/
#include<bits/stdc++.h>
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();++it)
#define Abs(x,y) ((x)>(y)?((x)-(y)):((y)-(x)))
#define ll long long
#define Mem0(x) memset(x,0,sizeof(x))
#define Mem1(x) memset(x,-1,sizeof(x))
#define MemX(x) memset(x,0x3f,sizeof(x))
#define pb push_back
using namespace std;
const int N=20;
bool flag[N];

int main(){
  int k,i,x,j;
  char n[N],s[N];
  while(~scanf("%s%d",n,&k)){
    Mem0(flag);
    for(i=0;i<k;++i){
      scanf("%d",&x);
      flag[x]=1;
    }
    int len=strlen(n),f1=0,f2=0;
    for(i=0;i<len;++i){
      if(f2){
        for(j=0;j<=9;++j){
          if(flag[j]==0 && j>n[i]-'0'){
            s[i]='0'+j;
            n[i]=s[i];
            break;
          }
        }
        if(j==10){
          if(!i){ f1=1; break; }
          i-=2,f2=1;
          continue;
        }else{
          f2=i;
          break;
        }
      }
      if(flag[n[i]-'0']){
        for(j=0;j<=9;++j){
          if(flag[j]==0 && j>n[i]-'0'){
            s[i]='0'+j;
            n[i]=s[i];
            break;
          }
        }
        //cout<<"i="<<i<<" f1="<<f1<<endl;
        if(j==10){
          if(!i){ f1=1; break; }
          f2=1,i-=2;
          continue;
        }else{
          f2=i;
          break;
        }
      }else s[i]=n[i];
    }
    //cout<<"f1="<<f1<<endl;
    if(f1){
      //cout<<"--------"<<endl;
      for(i=1;i<=9;++i)
        if(flag[i]==0){
          printf("%d",i);
          break;
        }
      for(i=0;i<=9;++i)
        if(flag[i]==0){
          while(len--)printf("%d",i);
          break;
        }
    }else{
      if(i==len)printf("%s",n);
      else{
        for(i=0;i<=f2;++i)
          printf("%c",s[i]);
        for(j=0;j<=9;++j)
          if(flag[j]==0){
            for(;i<len;++i)
              printf("%d",j);
            break;
          }
      }
    }
    puts("");
  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值