3 条题解

  • 2
    @ 2023-11-2 0:31:07

    刚接触贪心,花了一节课才有思路,回家把代码完善了。 我的思路是:若想保证删数后最小,那么就使位数越高的数值越小。

    所以我想从高位开始删数,以待删数量为删数区间长度,寻找该区间最小值,并把最小值之前的数删掉(相当于将数值小的数字向左移动),反复执行直至删数完成,那么结果就能保证数值越小的数,位数相对越高,就能达成最小数的目的。

    但执行期间还必须考虑一种情况,那就是当删数区间的第一个数已经是最小值时,该次删数便无需执行,但又要使删数继续进行,就需要将删数区间向右平移,并在下一次删数完成后将删数区间复位到最高位(因为平移后的删数区间的最小值和上层跳过执行的最小值的大小关系不清楚,需要放在一个区间里再次进行比较)

    一点拙见,期待大神指教

    #include<iostream>
    #include<string>
    using namespace std;
    string s;
    int main(){
    	int n,k=0;
    	cin>>s>>n;
    	while(n!=0){//待删数量不为0,则继续执行删数
    		int x=k;
    		for(int i=k;i<=k+n&&i<s.size();i++)//在高位删数区间内寻找最小值
    		if((s[i]-'0')<(s[x]-'0')) x=i;
    		if(x==k){//若x未更新,则说明最高位已经是删数区间内最小,则可删区间向右平移,并结束本次删数
    			k++;
    			continue;
    		}
    		for(int i=k;i<x;i++)//删去删数区间最小值左边的数
            s.erase(k,1);
    		n-=x-k;//更新待删数量
            k=0;//本次删数结束,删数区间复位
    	}
        while(s[0]==0) s.erase(0,1);//过滤最高位0
    	cout<<s;
    }
    
    • 1
      @ 2024-11-20 13:25:48
      #include<bits/stdc++.h>
      using namespace std;
      string s;
      int n,len;
      int main(){
      	cin>>s;
      	len=s.length();
      	scanf("%d",&n);
      	for(int i=1;i<=n;i++){
      		for(int j=0;j<len-1;j++){
      			if(s[j]>s[j+1]){
      				s.erase(j,1);
      				break;
      			}
      		}
      		len--;
      	}
      	int j=0;
      	while(s[0]=='0'&&len>1){
      		s.erase(0,1);
      		len--;
      	}
      	for(int i=0;i<len;i++)
      	cout<<s[i];
      	return 0;
      }
      

      思路同小蜘蛛

      • 0
        @ 2022-11-20 17:30:46
        using namespace std;
        int s,i,j,k;
        char n[241];
        int main()
        {
        	int m;
        	cin>>n;
        	cin>>s;
        	int len;
        	len=strlen(n);
        	for(i=1;i<=s;i++)
        	{
        		for(j=0;j<len-1;j++)
        		{
        			if(n[j]>n[j+1])
        			{
        				for(k=j;k<len-1;k++)
        				{
        					n[k]=n[k+1];
        				}
        				break;
        			} 
        		}
        		len--;
        	}
        	j=0;m=len;
        	while(n[j]=='0'&&m>1)
        	{
        		j++,m--;
        	}
        	for(i=j;i<len;i++)
        	{
        		cout<<n[i];
        	}
        	return 0;
         }
        

        //问题可以转化为求一个区间内递减序列首位字符 因为去掉第一个递减序列地字母后一定最大

        • 1

        信息

        ID
        440
        时间
        1000ms
        内存
        256MiB
        难度
        7
        标签
        递交数
        150
        已通过
        32
        上传者