题目:

输入两个数n和k,在n中删除k位,使得到的数最小

思路:先在前k个数中找出一个最小的数,将其前面的数都删除,

然后从当前位置开始遍历,若前面的数比后面的数大,则删除前面的数,

直至删除k个数,另外要考虑最前面为0的情况

View Code
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

int main()
{
string str;
int i,j,k,p,len,min;
while(cin>>str>>k)
{
len=str.length();
str="0"+str; //前补0
min=1000;
for(i=1;i<=k;i++) //在前k个数中找出最小的一个
{
if(str[i]<min)
{
min=str[i];
p=i;
}
}
str.erase(1,p-1); //删除最小数前面的所有数
k-=p-1; //k减去p-1
len-=p-1; //len减去p-1
for(i=1;i<=len&&k;i++)
{
if(str[i]>str[i+1]) //如果前面的比后面的大,则删除前面的
{
str.erase(i,1);
i-=2; //i前移
k--; //k减去1
len--; //长度减去1
}
}
for(i=0;str[i]=='0';i++); //计算最前面的0的个数
len++;
if(i==len)
cout<<'0'<<endl;
else
{
str.erase(0,i); //除去最前面的0
cout<<str<<endl;
}
}
return 0;
}


一些测试数据

/*

in:
178543
4
651770271679223389093118623
13
2969814017117127739588196709348094559867047
19
8637848955234498476470337247531766424079
16
43316217651867736901139344318292342940562476167081951858483668243755672
29
19307234583105219
2
822949958529834669558394483074672319748282212820411699219817
12
5930068566393493335779751598849001
7
285212433678415073336308057939227144014035418656130938196047408
20
210025094644307100604438135694972669216608224165230
20
308413883910600224079660861990751495761051589585922833034533834517353518714166396978589
33

out:
13
1223093118623
11111609348094559867047
234440337247531766424079
11122240562476167081951858483668243755672
107234583105219
222346558394483074672319748282212820411699219817
5393493335779751598849001
308057939227144014035418656130938196047408
134972669216608224165230
1589585922833034533834517353518714166396978589

*/

NYOJ 448  寻找最大数

http://acm.nyist.net/JudgeOnline/problem.php?pid=448

是求出一个最大值:

原理同求最小值:

View Code
#include<string>
#include<iostream>
using namespace std;

int main()
{
int T,i,p,k,len,max;
string str;
cin>>T;
cin.get();
while(T--)
{
cin>>str>>k;
len=str.length();
if(k==len)
{
cout<<"0"<<endl;
continue;
}
str="@"+str;
str+="@";
for(i=1,p=1,max=-1;i<=k;i++)
{
if(str[i]>max)
{
p=i;
max=str[i];
}
}
k-=p-1;
len-=p-1;
str.erase(1,p-1);
for(i=1;i<=len&&k;i++)
{
if(str[i]<str[i+1])
{
str.erase(i,1);
i-=2;
k--;
len--;
}
}
str.erase(0,1);
for(i=0;str[i]=='0';i++);
if(i==len)
cout<<"0"<<endl;
else
{
str.erase(0,i);
str.erase(len,1);
cout<<str<<endl;
}
}
return 0;
}



posted on 2012-03-24 15:37  pcoda  阅读(258)  评论(0编辑  收藏  举报