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

    题目传送门

    这么简单的贪心题我竟然交了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('
    ');
    	return 0;
    }
    
    
  • 相关阅读:
    SpringBoot配置文件
    SpringBoot基础开发流程
    day06-01数字类型、数字类型的转换
    特有的循环结构(for-else、while-else)——Python篇
    分支、循环——Python基础篇
    循环关键字——Python篇
    另类三目运算符——Python篇
    原码、反码以及补码
    Python运算符
    Python变量
  • 原文地址:https://www.cnblogs.com/karryW/p/11617936.html
Copyright © 2011-2022 走看看