码迷,mamicode.com
首页 > 其他好文 > 详细

删数问题

时间:2019-10-02 18:53:46      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:book   开头   最小   ace   using   code   区间   strlen   cpp   

题目传送门

这么简单的贪心题我竟然交了5遍。

先说一下题解的思路:
每一次都删第一个递减区间的首字符,如果没有递减区间就删最后一个。

自己的思路:
枚举在开头删几个元素,比较删除后首位的值,去一个最小的,把它前面的都删掉(相当于先保证首位最小)。然后再去递归解决子问题,同样的方法,只是能删的数减少了,起始位置向后了。

错点:

  • 1.删完之后可能有前导零,这些零要去掉。
  • 2.当要删的区间的长度比可以删的次数还小的话,要从后往前能删的都删掉。写\(while\)的时候应该是\(while(cnt>0)\)而不是\(while(cnt>=0)\)
  • 3.如果删完之后变成了0,不要没有输出。

上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 50005;
int n,k;
char a[N];
bool book[N];
void delet(int t,int l)
{
    if(l<=0) return ;
    if(t>n) return;
    int minn=9,id=0;
    for(int i=t;i<=t+l;i++)
     if(a[i]-'0'<minn)
      minn=a[i]-'0',id=i;
    for(int i=t;i<id;i++)
     book[i]=1,--l;
    if(n-id+1<=l)
    {
        int tmp=n;
        while(l>=1) 
        {
            if(!book[tmp]) book[tmp]=1,--l;
            --tmp;
        }
        return ;
    }
    delet(id+1,l);
}
int main()
{
    scanf("%s%d",a+1,&k);
    n=strlen(a+1);
    delet(1,k); 
    int at=1;
    bool flag=0;
    while(a[at]=='0'||book[at]) ++at;
    for(int i=at;i<=n;i++)
    if(!book[i]) putchar(a[i]),flag=1;
    if(!flag) putchar('0');
    putchar('\n');
    return 0;
}

删数问题

标签:book   开头   最小   ace   using   code   区间   strlen   cpp   

原文地址:https://www.cnblogs.com/karryW/p/11617936.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!