p1156集合删数
题目描述:
一个集合有如下元素:1是集合元素;若P是集合的元素,则2 * P +1,4*P+5也是集合的元素,取出此集合中最小的K个元素,按从小到大的顺序组合成一个多位数,现要求从中删除M个数位上的数字,使得剩下的数字最大,编程输出删除前和删除后的多位数字。
注:不存在所有数被删除的情况`
输入格式:
输入的仅一行,K,M的值,K,M均小于等于30000。
输出格式 Output Format
输出为两行,第一行为删除前的数字,第二行为删除后的数字。
样例输入 Sample Input
5 4
样例输出 Sample Output
137915
95
时间限制 Time Limitation
1s
经典问题
思路:先开一个数组num[i](初始num[1]=1别忘了),然后就从2*num[i]+1和4*num[i]+5中选较小的就行了,第二问我就是把数组中的数转换为字符串,因为你要删
m个数,所以就选k-m个数,要让选的数最大,就让最高位的数最大而且次高位的数也最大,依次类推;
这道题也又用到了数字转字符串,这是本焫鷄第二次遇到这个东西(我就用了两次QAQ)
头文件#include<sstream>
for(int i=1;i<=k;i++)//数字转为字符串
{
stringstream ss;
ss<<num[i];
string str;
ss>>str;
s+=str;
}
(我还是太鶸了)
代码如下:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #include<ctime> #include<sstream> using namespace std; long long num[310000]; int main() { int k,m; cin>>k>>m; num[1]=1; int s1=1,t1=1; for(int i=2;i<=k;i++) { int q=2*num[s1]+1; int w=4*num[t1]+5; if(q<w) { s1++; num[i]=q; } else if(q==w) { s1++;t1++; num[i]=q; } else { t1++; num[i]=w; } } for(int i=1;i<=k;i++) cout<<num[i]; cout<<endl; string s=""; for(int i=1;i<=k;i++)//数字转为字符串 { stringstream ss; ss<<num[i]; string str; ss>>str; s+=str; } //cout<<s1<<endl; string::iterator it =s.begin();s.insert(it,'9'); //在字符串开头填个9和后面的数进行比较 //cout<<s<<endl; int r=0; int n=s.size(); int sum=0; int h=1; while(h<=n&&sum!=m) { if(s[h]<=s[r]) { s[++r]=s[h++]; } else r--,sum++; } while(h<=n) s[++r]=s[h++]; for(int i=1;i<n-m;i++) cout<<s[i]; cout<<endl; return 0; }