标签:++i break 字符串 img close eof 字典序 can index
https://codeforces.com/contest/1367/problem/D
题意:给出一个字符(供我们挑选字符来构造)
给出一个序列 ,这个序列的值为:所有字典序比他大的字符坐标与他自身坐标的绝对值总和
让我们构造一个字符串,满足这个序列
思路:首先,在他要我们构造的序列中,肯定会有最大字符,所以最大字符在这个数字序列中的值肯定为0;
我们可以每次都找出0的位置,然后填写最大字符
这里有些情况,假如最大字符的个数小于本次找出0的个数,则直接跳过,然后找次大
如果满足,就直接用,这样子是肯定对的。
这里给出原因:本次无法用到这一轮的最大字符,那么在下一轮想要用的时候,这一轮的最大字符也是无法使用的,
然后依次循环得出答案即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=60; 4 char a[maxn]; 5 int op[maxn]; 6 int vis[maxn]; 7 int sto[maxn]; 8 char ans[maxn]; 9 bool cmp(int x,int y) 10 { 11 //字符类型应该也可以这样写吧 12 return x>y; 13 } 14 void init() 15 { 16 memset(sto,0,sizeof(ans)); 17 memset(vis,0,sizeof(vis)); 18 19 } 20 int main() 21 { 22 int T; 23 scanf("%d",&T); 24 while(T--){ 25 init(); 26 scanf("%s",a+1); 27 int len=strlen(a+1); 28 int m; 29 scanf("%d",&m); 30 for(int i=1;i<=m;i++) 31 scanf("%d",&op[i]); 32 sort(a+1,a+1+len,cmp); 33 for(int i=1;i<=len;i++){ 34 vis[a[i]-‘a‘]++; 35 } 36 len=unique(a+1,a+1+len)-a-1; 37 38 int now=1; 39 for(int k=1;k<=m;k++){ 40 int index=0; 41 for(int i=1;i<=m;i++){ 42 if(op[i]==0){ 43 sto[++index]=i; 44 } 45 } 46 if(index==0) break; 47 while(1){ 48 if(vis[a[now]-‘a‘]<index) 49 now++; 50 else{ 51 for(int kk=1;kk<=index;kk++){ 52 ans[sto[kk]]=a[now]; 53 // printf(" hahh :%c\n",a[now]); 54 } 55 now++; 56 break; 57 } 58 } 59 for(int i=1;i<=index;i++){ 60 int tmp=sto[i]; 61 op[tmp]=-1; 62 int base=1; 63 for(int j=tmp-1;j>=1;j--){ 64 op[j]-=base; 65 base++; 66 } 67 base=1; 68 for(int j=tmp+1;j<=m;j++){ 69 op[j]-=base; 70 base++; 71 } 72 } 73 } 74 for(int i=1;i<=m;i++){ 75 printf("%c",ans[i]); 76 } 77 printf("\n"); 78 } 79 return 0; 80 }
标签:++i break 字符串 img close eof 字典序 can index
原文地址:https://www.cnblogs.com/pangbi/p/13354144.html