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;
    
    }
  • 相关阅读:
    C#编程:依赖倒置原则DIP
    java项目与javaweb项目导入jar包的区别
    《C#从入门到精通(第3版)》目录
    Sublime Text 格式化代码
    ThinkPHP 入门
    CentOS 7.2配置LAMP环境——yum版
    打包名命令:tar
    不规则数组的构建
    Linux文件权限概念
    tomcat启动成功但是没有监听8080端口
  • 原文地址:https://www.cnblogs.com/sun915/p/9493926.html
Copyright © 2011-2022 走看看