把最后算的数拼接起来 然后按贪心的思想去删数
假设第i个数为a[i] 删m个数 那么从左往右搜 如果a[i]<a[i+1] 那么可以直接删去a[i] 一直删m个为止 恕我太菜 不会证明 但应该是对的
by little_kongbai @ 2020-12-29 13:18:10
抱歉 上述删数代码翻车 0pts代码
```cpp
#include<bits/stdc++.h>
using namespace std;
int k,m,Mmin=9,a[30005],tot,ls;bool f[30005];
priority_queue<int> q;
void work(int n){
int n_length=0,n2=n;
while(n2!=0){
n2/=10;
n_length++;
}
//cout<<n<<" "<<n_length<<endl;
n2=n;
for(int i=0;i<n_length;i++){
a[tot+n_length-i]=n2%10;
n2/=10;
}
tot+=n_length;
}
int main(){
scanf("%d%d",&k,&m);q.push(-1);
memset(f,1,sizeof(1));
for(int i=1;i<=k;i++){
ls=-q.top();q.pop();
q.push(-(ls*2+1));q.push(-(ls*4+5));
work(ls);
}
for(int i=1;i<=tot;i++)printf("%d",a[i]);
printf("\n");
for(int i=1;i<=tot;i++){
if(a[i]<a[i+1]&&m>0){
m--;
continue;
}
printf("%d",a[i]);
}
return 0;
}
```
by little_kongbai @ 2020-12-29 14:28:45
```
#include<bits/stdc++.h>
using namespace std;
string str;
char p[100005];
long long K,l,j,m,i=1,ans[1000005]= {1,3},rear,front,q,g;
int main() {
cin>>K>>m;
rear=2;
while(rear!=K) {
ans[rear++]=i*4+3;
if(rear==K)
break;
ans[rear++]=i*4+5;
i=i*2+1;
}
for(i=0; i<K; i++)
cout<<ans[i];
cout<<endl;
for(i=K-1; i>=0; i--)
while(ans[i]!=0) {
p[g++]=ans[i]%10+48;
ans[i]/=10;
}
for(i=g-1; i>=0; i--) {
str+=p[i];
}
str+='0';
for(i=0; i<=K; i++) {
if(str[i]<str[i+1]&&m>0)
m--;
else
cout<<str[i];
}
}
```
我也翻车了
by LN07S—117 @ 2020-12-30 13:27:51
@[linnuo1011](/user/262922) 我现在是40pts 剩下的由于各种操作直接TLE
by little_kongbai @ 2020-12-30 13:36:23
@[kongbaijun](/user/232205)
emmm...
by LN07S—117 @ 2021-01-02 12:49:38
经过一番死磕被磕死
by LN07S—117 @ 2021-01-02 12:53:09
@[kongbaijun](/user/232205) 教教我呗
我太菜了
by LN07S—117 @ 2021-01-02 13:02:16