• 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               */ 
  • 相关阅读:
    D触发器的使用小结
    CAN通信帧ID的含义解析? (转载)
    mcp2515屏蔽寄存器和过滤寄存器的学习
    spi调试步骤,mcp2515调试整理
    最近工作小结2019.11.24
    Can总线上的电平及物理层仲裁
    can总线学习网上资料汇总
    can总线的远程帧(遥控帧)—说的很形象
    在IAR平台建立STC8ASK64S4A12单片机工程
    cortex-m系列的区别(图解)及今日碎片学习笔记
  • 原文地址:https://www.cnblogs.com/paulzjt/p/6129346.html
Copyright © 2020-2023  润新知