Codeforces Round #598 (Div. 3) D. Binary String Minimizing (贪心)

链接:

题意:给一个01串,可以交换相邻两个的位置k次问字典序最小的序列;

简单的贪心题,每次考虑把最小的往前放,最小只有零,找一下交换的代价即可;

code;

#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
void solve()
{
  int n;
  long long k;
  cin>>n>>k;
  vector<int> v;
  string s;
  cin>>s;
  for(int i=0; i<s.size(); i++)
  {
    if(s[i]=='0')
     v.push_back(i);//0 position
  }
  int la=-1;
  for(int i=0; i<v.size(); i++)
  {
    if(k>v[i]-la-1)
    {
      int cost=v[i]-la-1;
      k-=cost;
      v[i]=la+1;//记录交换次数
      la=v[i];
    }
    else
    {
      v[i]-=k;
      break;
    }
  }
  std::vector<int> ans(s.size(),1);
  for(int i=0; i<v.size(); i++)
    ans[v[i]]=0;
  for(int i=0; i<ans.size(); i++)
    cout<<ans[i];
  cout<<endl;
}
int main()
{
  int t;
  cin>>t;
  while(t--) solve();
  return 0;
}

猜你喜欢

转载自www.cnblogs.com/sweetlittlebaby/p/12709873.html
今日推荐