zoukankan      html  css  js  c++  java
  • 【题解】删数问题加强版

    描述

    键盘输入一个高精度的正整数N,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和M寻找一种方案使得剩下的数字组成的新数最小。输出组成的新的正整数。 输入数据均不需判错。如果去掉了某几个位后得到的新整数开头为0,保留0。

    输入
    第一行为高精度正整数N(N的长度不超过10^6位) 第二行为M(0<=M<=N的长度)

    输出
    去掉M位后的最小新数。

    样例
    输入
    82386782
    3
    输出
    23672


    这道题并不特别难,我们首先要明白他是如何走的,我们开始必须要从左到右走一遍:就按样例来走,82386782,8比2大,继续走,8也比3大,但第四个8就相等了,我们就删除,这样走下去。
    RE:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 string s;
     4 int n,cnt=0,j;
     5 int main(){
     6     cin>>s;
     7     cin>>n;
     8     if(n>=s.size())cout<<0;
     9     for(int i=0;i+1<s.size();i++){
    10         if(s[i] > s[i + 1]){
    11             s.erase(i,1);
    12             if(++cnt==n)break;
    13             i-=2;
    14         }
    15     }
    16     if(cnt<n)s.erase(s.size()-n+cnt,n-cnt);
    17     for(j=0;j<s.size();j++){
    18         if(s[j]!='0')break;
    19     } 
    20     if(j==s.size()){
    21         cout<<0<<endl;
    22     }else{ 
    23         cout<<s.substr(j)<<endl;
    24     }
    25     return 0;
    26 }

    AC:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main(){
     4     string x;
     5     long long S,i;
     6     cin>>x>>S;
     7     if(S>=x.size())cout<<0;
     8         while(S--){
     9             
    10             int len=x.length();
    11             for(i=0;i+1<len;)
    12                 if(x[i]>x[i+1]){
    13                     x.erase(x.begin()+i);
    14                     break;
    15                 }
    16                 else i++;
    17             if(i+1==len)
    18                 x.erase(x.begin()+i);
    19         }
    20         cout<<x<<endl;
    21         return 0;
    22 }
  • 相关阅读:
    问题 G: 艰难取舍(dp)
    算式
    问题 G: 背菜谱
    问题 B: 寻路
    问题 D: 数字变换(dfs)
    问题 D: 2的幂数
    问题 C: 幸运数字II(4,7)
    问题 D: 莱布尼茨三角形
    问题 E: 有理数树
    2020年秋高级软件工程”领跑衫“获奖感言
  • 原文地址:https://www.cnblogs.com/rebirth-death2019/p/13778643.html
Copyright © 2011-2022 走看看