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

  

原文地址:https://www.cnblogs.com/edmunds/p/13398334.html