码迷,mamicode.com
首页 > 其他好文 > 详细

D. Task On The Board 构造题

时间:2020-07-21 14:27:38      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:++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 }
View Code

 

D. Task On The Board 构造题

标签:++i   break   字符串   img   close   eof   字典序   can   index   

原文地址:https://www.cnblogs.com/pangbi/p/13354144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!