题目描述:
以前,西藏是农奴社会,每个农奴主都拥有数目众多的农奴,这些农奴的整个生命都是农奴主的,农奴主可以随便处死任意一名农奴。
解放西藏时,政府为了保持农奴主的利益和西藏的和平,并没有立刻废除农奴制度,倒是一些农奴主没有丝毫地改变旧习惯,打死农奴的情况时有发生。
这天,一个小农奴主又在为难农奴们了,他把他家每一条耗牛背上都写上了一个个位数字(0--9),然后把任意一些牛排在一起,这样就组成了一个多位数字。
现在他为难大家的难题是,对于牛组成的这个多位数字,他每次会扔出几颗石头,扔出几颗石头就表示需要农奴们从那排牛中赶走多少头牛,这样剩下的牛不改变顺序又组成了一个新的数字,他的要求是,这个新的数字必须要最小。
如果大家完成不了他的难题,那么每个农奴都要挨打,要知道他打人可是出了名的,不知道有多少个农奴被他打死了。
你能帮助那些农奴们吗?请编写一个程序完成这项任务,然后夺下农奴主手里的皮鞭。
输入格式:
N I (N是由牛背上的数字排成的多位数,已经牛的数量最少为2,最多为100,I表示扔出的石头的数量,即要从牛中赶走I头牛)
输出格式:
S (赶走I头牛后剩下的牛组成的数字,要求这个新的数字最小)
输入样例:
1432 2
输出样例:
12
思路描述:
将思路从寻找需要去掉的数转化为需要保留的数。假设输入的数字是3257296,一共有7位,需要去掉3位,保留4位。先寻找答案的首位,应该从3257中寻找最小值,找到最小值是2.则下一位应该从572中开始寻找,找到最小值2……最后的答案就是2296。
细节注意:
最后输出前要处理一下前导零(当数字只有一位时前导零是要输出来的)。
AC代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[105];
char ch[105];
int res[105] = { 0 };
int main()
{
cin >> ch;
int cnt= 0;
for (int i = 0; i <strlen(ch); i++)
{
a[++cnt] = ch[i] - '0';
}
int m;
cin >> m;
int k = 0;
int l = 1, r = m+1;//每次查找的范围
int minloc = 1;//记录每次查找到的最小值的下标
int j;
while(k<cnt-m)
{
int minn = 0x3f3f3f3f;
for ( j = l; j <= r; j++)
if (a[j] < minn)
{
minn = a[j];
minloc = j;
}
l = minloc+ 1;
r++;
res[++k] = minn;
}
//处理前导零
int sta = 1;
int end = k;
while (res[sta] == 0 && k > 1)
{
sta++;
k--;
}
for (int i = sta; i <= end; i++) cout<<res[i];
return 0;
}