题意
给你n个数要求删除m个使得剩下的数最大
思路
采用贪心策略,我们每次只要从可以选择的一个区间里面选择一个最大的数字就可以了,这样每次取完之后就是最大值。
刚开始由于要保留n-m个数所以我们应该从m个数里面取最大值,每次增大这个区间,但是有个情况,对于当前元素,已经是最优值了并且从这个值开始后面的数字都满足,所以就直接输出就行,排序的时候还要注意按照id来排序
#include <iostream>
#include <queue>
using namespace std;
struct node{
int num,id;
bool operator <(const node &b)const{
if(num==b.num) return id>b.id;
return num<b.num;
}
}num1[100005];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2&&n)
{
priority_queue<node> pq;
for(int i=0;i<n;i++)
{
scanf("%1d",&num1[i].num);
num1[i].id=i;
}
int i;
for(i=0;i<=m;i++)
pq.push(num1[i]);
int pre=-1;
int k=n-m;
while(k)
{
while(pq.top().id<pre) pq.pop();
node t=pq.top();pq.pop();
if(t.id==n-k)
{
for(int i=t.id;i<n;i++)
printf("%d",num1[i].num);
break;
}
printf("%d",t.num);
pre=t.id;
k--;
pq.push(num1[i++]);
}
printf("\n");
}
return 0;
}