Problem Description
给定n 位(n≤100)正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n 位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。
对于给定的正整数a,计算删去k 个数字后得到的最小数。
Input
输入数据的第1 行是1 个正整数a。第2 行是正整数k。
Output
将计算出的最小数输出。
Example Input
178543
4
Example Output
13
ps:题目本身并不难,就是找不降序列,找到那个临界点,然后删掉,然后再从头进行以上行为。这个题有个巨坑,那就是最后要把前面的0给删掉,否则就是一直Output Limit Exceeded,因为这个错我还去看了别人的代码,想想真的是….都是泪,我还以为我的逻辑有问题。
我的代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,ii=1;
void go(vector<int>&vec) {
vector<int>::iterator end = vec.end();
vector<int>::iterator begin = vec.begin();
if (m == n) {
auto iter = begin;
for (; iter < end; iter++) {
if (*iter == 0);
else break;
}
for (;iter<end;iter++)
cout << *iter;
cout << endl;
return;
}
else {
for (int i = 1; i < vec.size(); i++) {
if (m < n) {
ii = 1;
if (vec[i] >= vec[i - 1]);
else {
vec.erase(find(begin,end, vec[i - 1]));
m++; ii = 0;
go(vec);
}
}
}
if (ii&&m<n) {
vec.erase(end-1);
m++;
go(vec);
}
}
}
int main(void) {
string str;
while (cin >> str >> n) {
vector<int>vec;
for (int i = 0; i < str.length(); i++) {
vec.push_back(str[i] - '0');
}
m = 0;
go(vec);
}
//system("pause");
return 0;
}
/***************************************************
User name:
Result: Accepted
Take time: 0ms
Take Memory: 212KB
Submit time:
****************************************************/
我用的是递归,其实并不好,用while就可以替代递归。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int k,i,flag;
string n;
while(cin>>n>>k)
{
vector <char> s(n.begin(),n.end());
while(k--)
{
vector <char>::iterator j=s.begin();
i=0;
while(i!=s.size()-1)
{
flag=1;
if(s[i]>s[i+1])
{s.erase(j);flag=0;break;}
i++;j++;
}
if(flag)
s.erase(j);
}
for(i=0;i<s.size();i++)
if(s[i]!='0')break;
while(i!=s.size())
cout<<s[i++];
cout<<endl;
}
return 0;
}
/***************************************************
User name:
Result: Accepted
Take time: 0ms
Take Memory: 212KB
Submit time:
****************************************************/
这些代码有一点要注意,也算是容器的知识点吧,每一次操作过后,如果对容器进行了删除操作,他的迭代器就会失效,需要重新定义,记住这一点。
2018.3.28日更新
第一份代码的34行左右的判定解释:当数列所有的数都是上升序列不存在逆序对时,删掉的数还不到要求,就删除最后一位,保证留下最小的数