hrbust 1481

  1   /*  构造特定条件的68序列:给定目标串中6 8 68 86 这四种字串的个数a b p q ,输出所有满足条件的字符串中代表的数字最小的那个 
  2           //  hrboj 1481  _______________________________________________________________________
  3               //#include<bits/stdc++.h>     
  4               #include<iostream>
  5               #include<string>
  6               #include<cstdio>
  7 
  8               using namespace std;  
  9               typedef long long  ll;
 10               typedef pair<ll,ll> pll;  
 11               #define pb(x) push_back(x)   
 12               #define ss(x) scanf("%s",x)
 13               #define sd(x) scanf("%d",&x) 
 14               #define sll(x) scanf("lld",&x)
 15               typedef unsigned long long  ull;     
 16               #define mem(A, X) memset(A, X, sizeof A)
 17               #define ford(i,l,u) for(ll (i)=(ll)(l);(i)>=(ll)(u);--(i))
 18               #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e)
 19               #define fori(i,l,u) for(ll (i)=(ll)(l);(i)<=(ll)(u);++(i))
 20               #define delete_this freopen("in.txt","r",stdin)
 21               #define sd2(x,y) scanf("%d%d",&x,&y)
 22               #define slf(x) scanf("%lf",&x)
 23               #define sc(x) scanf("%c",&x)
 24               #define sec second
 25               #define fir first  
 26 
 27               const ll mod=1e9+7; 
 28               const ll maxn=1e5+10; 
 29               int a,b,p,q; 
 30               void out6(int a )
 31               {
 32                   fori(i,1,a) printf("6");
 33               }
 34               void out8(int a )
 35               {
 36                   fori(i,1,a) printf("8");
 37               }
 38               void out68(int a )
 39               {
 40                   fori(i,1,a) printf("68");
 41               } 
 42               int main()
 43               {
 44                    //delete_this;  
 45                    while(cin>>a)
 46                    {                        
 47                         cin>>b>>p>>q; 
 48                         int flag=1;  
 49                         if(a==p)
 50                         { 
 51 
 52                               if(q==p)
 53                               { 
 54 
 55                                      if(b>=p+1)
 56                                     { 
 57                                           flag=0;
 58                                           out8(1);
 59                                           out68(p);
 60                                           out8(b-p-1); 
 61                                     } 
 62                               }
 63                                     else if(q==p-1)
 64                                     {
 65                                           if(b>=p)
 66                                           {
 67                                                 flag=0;
 68                                                 out68(p);
 69                                                 out8(b-p); 
 70                                           } 
 71                                     }
 72 
 73 
 74                         }
 75                               else if(a>p)
 76                               {
 77                                     if(q==p)
 78                                     {
 79                                           if(b>=p)
 80                                           {
 81                                                 flag=0; 
 82                                                 out6(a-(p+1));
 83                                                 out68(p);
 84                                                 out8(b-p);
 85                                                 out6(1); 
 86                                           } 
 87                                     }
 88                                           else if(q==p-1)
 89                                           {
 90                                                 if(b>=p)
 91                                                 { 
 92                                                       flag=0;
 93                                                       out6(a-p);
 94                                                       out68(p);
 95                                                       out8(b-p); 
 96                                                 } 
 97                                           }
 98                                                 else if(q==p+1)
 99                                                 {
100                                                       if(b>=p+1)
101                                                       {
102                                                             flag=0;
103                                                             out8(1);
104                                                             out6(a-p-1);
105                                                             out68(p);
106                                                             out8(b-p-1);
107                                                             out6(1);
108                                                       }
109                                                 }
110 
111                               } 
112 
113                         if(flag) puts("-1");
114                         else puts("");    
115                    }
116 
117                 return 0;
118               }
119   
120              /*

分析: 记目标串有a个6,b个8,p个68子串,q个86子串。
6和8的个数是固定的,于是字符串的长度固定。 现在尝试对所有可能存在解的情况进行构造。
这里选择a,p的个数的关系分情况进行讨论,并在之后选择优先放置68 86这类子串(反过来的话可能会比较复杂)。
所有的可能存在解的情况分为(1)a==p  (2)a>p

121                 note    :   构造类的问题  分类逻辑分支都进行讨论到 是很关键的,在保证不重不漏的情况尽量简化。
122                               此外有一些很好的思路: 考虑某些关键性变量,通过进行限制,减少分类的情况进行简化。比如这里选择68为分类标准。
123                                                       考虑那些确定的量 ,单个6 8的个数,因为其没有重复,可以作为考虑的依据和数字长度的确定。
124                                                       考虑构造的先后次序,哪些重要,哪些不重要。这里优先68 然后86。之后的单个数字就很好处理了
125                 debug   :   68可能比86少一个是有可能的,即代码中的else if q==p+1的这一分支,  具体的例子 比如  868686,2个68,3个86.
126                 optimize:   一些重复性的操作---->函数简化。
127                             只考虑可能产生解的逻辑分支,其他else不管。
128               */ 

 

posted @ 2016-12-03 18:53  TechIsOnlyTool  阅读(236)  评论(0编辑  收藏  举报