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               */ 
时间: 2024-10-29 10:46:44

hrbust 1481的相关文章

1481:Maximum sum

1481:Maximum sum 总时间限制:  1000ms 内存限制:  65536kB 描述 Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: t1 t2 d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 < s2 <= t2 <= n } i=s1 j=s2 Your task is to calculate d(A). 输入

rwkj 1481

//1481#include <iostream>#include <cstdio>using namespace std;#define N 50010int parent[N],sum;void init(){ for(int i=1;i<=N;i++)parent[i]=i; }int find(int x){ if(x==parent[x])return x; else return find(parent[x]);}void marge(int a,int b){

HRBUST 1214 方格取数

方格取数 Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HRBUST. Original ID: 121464-bit integer IO format: %lld      Java class name: Main 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0.如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走

HRBUST 1161 树状数组区间更新求和

Leyni Time Limit: 3000 MS Memory Limit: 65536 K Total Submit: 267(64 users) Total Accepted: 82(57 users) Rating: Special Judge: No Description Leyni被人掳走,身在水深火热之中... 小奈叶为了拯救Leyni,独自一人前往森林深处从静竹手中夺回昏迷中的Leyni. 历经千辛万苦,小奈叶救出了Leyni,但是静竹为此极为恼怒,决定对他们发起最强烈的进攻.

hrbust 1840 (树状数组第k大) 删点使用

小橙子 Time Limit: 2000 MS Memory Limit: 32768 K Total Submit: 2(2 users) Total Accepted: 1(1 users) Rating:  Special Judge: No Description 玻璃小屋里曾经住着一个小橙子.小橙子小小的,性格很直.直性子的小橙子傻乎乎的,还很爱看火影.海贼王什么的.他收藏了很多动画片的光碟,光碟太多了,他打算整理一下. 他口中念念有词:“这个,插入第三个光碟前面,这个,插入第五个光碟

HRBUST 1818 石子合并问题--直线版

石子合并问题--直线版 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HRBUST. Original ID: 1818 64-bit integer IO format: %lld      Java class name: Main 一条直线上摆放着一行共n堆的石子.现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分.请编辑计算出将n堆石子合

HRBUST 1328 相等的最小公倍数

SOl:将原题改为枚举N的每一对因子,计算其是否互素即可. #include <cstdio> #include <cstring> #include <cmath> using namespace std; inline int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int n,T,i,j; scanf("%d",&T); while(T--) { bool

hrbust/哈理工oj 1617 回家【BFS+BFS】

回家 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 35(9 users) Total Accepted: 10(8 users) Rating: Special Judge: No Description 寒假里,大家经常会遇上同学聚会,ikki也不例外. ikki所在的城市可以看成是一个正方形的布局,分为n*n个小方格区域.ikki每次聚会的场所都在城市的西北角,即方格 (1,1)表示的位置,而家位于城市的东南角,即(n,n)

hrbust oj 1536 Leonardo&#39;s Notebook 置换群问题

题目大意: 给出一个A~Z的置换G,问能否找到一个A~Z的置换G' 能够用来表示为 G = G'*G' 由定理: 任意一个长为 L 的置换的k次幂,都会把自己的每一个循环节分裂成gcd(L, K)份,并且每一份的长度都为L/gcd(L,K) 这里是置换的平方,所以G'长度为偶数的循环节必然会分裂为两个相等的循环节,长度为奇数的循环节还是一个循环节长度不变 那么得到的G中长度为偶数的循环节必然是由G'中偶数的循环节分裂得到,奇数的循环节可以不多做考虑,就认为它是原来的奇数循环节保持不变所得 所以这