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

    【题目描述】

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

    输出新的正整数。(n不超过240位)

    输入数据均不需判错。

    【输入】

    n

    s

    【输出】

    最后剩下的最小数。

    【输入样例】

    175438
    4
    

    【输出样例】

    13


    这个题有个大坑!
    我就先想到是删最大的数,
    剩下小的就行了;
    其实不然,
    我们看几组数据,
    125448
    如果是删“8”的话,
    余下12544;
    如果删“5”呢?
    泽余12448;
    显然删5合适,
    因为我们删掉一位数字,
    相当于把这位数放在个位,
    然后/10,
    也就是整体向右移;
    所以怎样才能最小呢?
    这里用贪心法,
    我们从高位往低位一步一步走,
    如果高位比低位的大,
    就删这个高位的,
    举个例子,
    12547,
    5>4,
    我们就删5,
    而不是7;
    我们想一下,
    余下的数字,
    是不是越高的位数数值越小,
    这个数就越小?
    所以,当高位数>低位数时,
    删掉这个大的,
    就可以求得最后结果。
     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 int main()
     5 {
     6     int s;
     7     char n[250];
     8     cin>>n>>s;
     9     int lenn=strlen(n);
    10     for(int i=1;i<=s;i++)
    11     {
    12         for(int j=0;j<lenn-1;j++)
    13         {
    14             if(n[j]>n[j+1])
    15             {
    16                 for(int k=j;k<lenn-1;k++)
    17                 n[k]=n[k+1];
    18                 break;
    19             }
    20         }
    21         lenn--;
    22     }
    23     int a=0,m=lenn;
    24     while(n[a]==48&&m>1)
    25     {
    26         a++;
    27         m--;
    28     }
    29     for(int i=a;i<lenn;i++)
    30     cout<<n[i];
    31     return 0;
    32 }

    每日打卡 O(∩_∩)O~

    看不见我看不见我看不见我
  • 相关阅读:
    20165334 我期待的师生关系
    20165228 我期望的师生关系
    20165232 预备作业3 Linux安装及学习
    20165232 学习基础和c语言基础调查
    20165232 我期望的师生关系
    20165320 第一周学习总结
    20165320 预备作业3 :Linux安装及命令入门
    20165320 预备作业2:技能学习心得与C语言学习
    20165320 我期望的师生关系
    20165203 学习基础和C语言基础调查
  • 原文地址:https://www.cnblogs.com/sxy2004/p/11494861.html
Copyright © 2011-2022 走看看