zoukankan      html  css  js  c++  java
  • 删数问题

    D14553. 删数问题

    时间限制1.0s   内存限制256.0MB

    输入文件名:test.in   输出文件名:test.out

    问题描述

      键盘输入一个高精度的正整数n(<=240位),去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。

    输入格式

      n
      s

    输出格式

      最后剩下的最小数

    样例输入

    178543
    4

    样例输出

    13

    思路:

    愚昧的贪心策略:每次删去最大的一个数。

    可以举出反例:n=23619,s = 1。若如删9,得2361。然而最小为删6,得2319。

    正确的策略:删峰。即删去第一个比下一位数大的一个数。

    不会证明。

    使用string中的删除函数快速实现。记得删前导零。

    Code:

    #include<bits/stdc++.h>
    
     
    
    using namespace std;
    
     
    
    string num;
    
    int k;
    
     
    
    int main(){
    
           freopen("test.in","r",stdin);
    
           freopen("test.out","w",stdout);
    
           cin >> num;
    
           cin >> k;
    
           while (k--) {
    
                  int len = num.size();
    
                  for (int i = 0; i < len; i++)
    
                         if (num[i] > num[i + 1]) {
    
                                num.erase(i,1);
    
                                break;
    
                  }//删峰
    
                  int p = 0;
    
                  while(num[p] == '0') p++;
    
                  num.erase(0, p);//删前导0
    
           }
    
           if (num.empty()) cout << 0 << endl;
    
           else cout << num << endl;
    
           return 0;
    
    }
  • 相关阅读:
    前端博客收集
    Oracle 数据库性能调优
    vue解决跨域问题
    IIS相关问题及解决方案
    《软件测试工程师》学习笔记
    Matlab学习笔记(一)
    排序算法及分析
    Silverlight学习笔记——跨域调用
    Matlab学习笔记(三)
    C#的一些必备技术
  • 原文地址:https://www.cnblogs.com/sun915/p/9493926.html
Copyright © 2011-2022 走看看