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; }