1. 程式人生 > 實用技巧 >D. Task On The Board 構造題

D. Task On The Board 構造題

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 }
View Code