[SDUT](2072)删数问题 ---贪心

xiaoxiao2021-02-28  95

删数问题

Time Limit: 1000MS  Memory Limit: 65536KB Submit  Statistic  Discuss

Problem Description

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

Input

  输入有多组 每组包括原始数n,要去掉的数字数s;

Output

 输出去掉s个数后最小的数

Example Input

178543 4

Example Output

13

解题新知:

         ①注意:首先之前没有认真读题,直接将数字组中的每个数字排序,删掉S个最大的,以为就可以了,但是不行。题中说到“按照原来的左右次序组成一个新的正整数”,那么就不能打乱原数字组了。         ②思路:采用贪心的策略,每删除当前最大的一个数字的时候,其他的数字次序要不变,比如178543,删掉8后,543要往左移动,即17543。每当找到当前的最大数,其后面的数字要进行移动覆盖。 AC代码: #include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() { char num[105]; //int a[105]; int s; while(cin>>num) { cin>>s; int n=strlen(num); int t=s; if(n<=s) { cout<<"0"<<endl; continue; } /*for(int i=0;i<n;i++) { a[i]=int(num[i])-48; }*/ while(t>0) { int i=0; while(i<n && num[i]<=num[i+1]) i++; for(int j=i;j<n;j++) num[j]=num[j+1]; t--; } int j=0; while(num[j]=='0') j++; if(j==n-s) cout<<'0'; for(int i=j;i<n-s;i++) cout<<num[i]; cout<<endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-41569.html

最新回复(0)