cf1367D---构造
题目链接:https://codeforces.com/contest/1367/problem/D
简单题意:给定原字符串s,要求删去一些字符得到新字符串t,使得ti与比它大的distance总和=bi
构造。对于当前未访问过的bi=0的位置(可能不止一个),填上当前未使用的最大字符(如果数量足够的话),并把数组b的其他位置的值,减去到当前bi=0位置的distance。此时又会产生新的bi=0的位置,进行同样的构造即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int i,j,m,q,len;
int vis[100],b[100],num[100];
char s[100];
int main(){
cin>>q;
while (q--){
char ans[100];
cin>>s+1>>m;len=strlen(s+1);
for (i=1;i<=m;i++) cin>>b[i];
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
for (i=1;i<=len;i++) num[s[i]-'a'+1]++;
int k=26;
while (1){
int f=0;
vector<int> v;
for (i=1;i<=m;i++)
if (vis[i]==0){
f=1;
if (b[i]==0) v.push_back(i);
}
if (f==0) break;
while (num[k]<v.size()) k--; //*
for (i=0;i<v.size();i++){
ans[v[i]]=k+'a'-1;vis[v[i]]=1;
}
k--;
for (i=0;i<v.size();i++)
for (j=1;j<=m;j++)
if (vis[j]==0) b[j]-=abs(v[i]-j); //*
}
for (i=1;i<=m;i++) cout<<ans[i];cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号