• Color Changing Sofa Gym


    Color Changing Sofa

     Gym - 101962B

    题意:给你一个由字母构成的字符串a,再给你一个由0、1构成的字符串b。你需要在a字符串中找到一个可以放下b的位置,要保证b字符串中0对应a字符串的位置每一个字符相等。且b字符串中1对应a字符串的位置每一个字符相等。你也可以把b字符串反着放置(也就是如果b字符串为0100,你也可以把它当作0010)

    输出可以找到多少符合要求的位置

    题解:

    暴力模拟可以放置的所有位置

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define INF 0x3f3f3f3f;
     5 
     6 char s[2100], a[2100], b[2100];
     7 int n, m;
     8 bool check1(int pos)
     9 {
    10     char f1, f0;
    11     for (int i = pos; i <= pos + m - 1; i++)
    12     {
    13         if (a[i - pos + 1] == '1')
    14             f1 = s[i];
    15         if (a[i - pos + 1] == '0')
    16             f0 = s[i];
    17     }
    18     for (int i = pos; i <= pos + m - 1; i++)
    19     {
    20         if (a[i - pos + 1] == '1' && s[i] != f1)
    21             return 0;
    22         if (a[i - pos + 1] == '0' && s[i] != f0)
    23             return 0;
    24     }
    25     return 1;
    26 }
    27 
    28 bool check2(int pos)
    29 {
    30     char f1, f0;
    31     for (int i = pos; i <= pos + m - 1; i++)
    32     {
    33         if (b[i - pos + 1] == '1')
    34             f1 = s[i];
    35         if (b[i - pos + 1] == '0')
    36             f0 = s[i];
    37     }
    38     for (int i = pos; i <= pos + m - 1; i++)
    39     {
    40         if (b[i - pos + 1] == '1' && s[i] != f1)
    41             return 0;
    42         if (b[i - pos + 1] == '0' && s[i] != f0)
    43             return 0;
    44     }
    45     return 1;
    46 }
    47 int main()
    48 {
    49     scanf("%s", s + 1);
    50     scanf("%s", a + 1);
    51     n = strlen(s + 1);
    52     m = strlen(a + 1);
    53     for (int i = 1; i <= m; i++)
    54         b[i] = a[m - i + 1];
    55     int res = 0;
    56     for (int i = 1; i <= n - m + 1; i++)
    57     {
    58         if (check1(i))
    59             res++;
    60         else if (check2(i))
    61             res++;
    62     }
    63     printf("%d
    ", res);
    64 
    65     return 0;
    66 }
    View Code

    Renan and Cirque du Soleil

     Gym - 101962C

    题意:

    给你一个长度为n的数组a,找出来这个数组a的所有子集合,让这个子集合中的最大值减去最小值。把所有子集合的最大值-最小值加起来取模于1e9+7输出就可以

    题解:

    找规律,之后矩阵快速幂

    a2=1

    找到的规律是ai=2*ai-1+2i-(i+1)

    找一个系数矩阵

    | 2 1 -1 0 |

    | 0 2 0 0 |

    | 0 0 1 1 |

    | 0 0 0 1 |

    最后乘于

    | 1 |

    | 8 |

    | 4 |

    | 1 |

    代码:

      1 /*
      2  * @Author: hesorchen
      3  * @Date: 2020-11-21 17:26:53
      4  * @LastEditTime: 2020-11-24 16:05:21
      5  * @Description: 栽种绝处的花
      6  */
      7 #include <bits/stdc++.h>
      8 using namespace std;
      9 const long long mod = 1e9 + 7;
     10 #define INF 0x3f3f3f3f;
     11 
     12 struct node
     13 {
     14     long long a[4][4];
     15 };
     16 void mes(node &d)
     17 {
     18     for (long long i = 0; i < 4; ++i)
     19     {
     20         for (long long j = 0; j < 4; ++j)
     21         {
     22             d.a[i][j] = 0;
     23         }
     24     }
     25 }
     26 void init(node &res)
     27 {
     28     mes(res);
     29     for (long long i = 0; i < 4; ++i)
     30     {
     31         res.a[i][i] = 1;
     32     }
     33 }
     34 node mul(node b, node c)
     35 {
     36     node d;
     37     mes(d);
     38     for (long long i = 0; i < 4; ++i)
     39     {
     40         for (long long j = 0; j < 4; ++j)
     41         {
     42             for (long long k = 0; k < 4; ++k)
     43             {
     44                 d.a[i][j] = (d.a[i][j] + ((b.a[i][k] * c.a[k][j]) % mod)) % mod;
     45             }
     46         }
     47     }
     48     return d;
     49 }
     50 node quick(node a, long long b)
     51 {
     52     node res;
     53     init(res);
     54     while (b)
     55     {
     56         if (b & 1)
     57         {
     58             res = mul(res, a);
     59         }
     60         a = mul(a, a);
     61         b >>= 1;
     62     }
     63     return res;
     64 }
     65 int main()
     66 {
     67     long long t;
     68     scanf("%lld", &t);
     69     while (t--)
     70     {
     71         long long n;
     72         scanf("%lld", &n);
     73         if (n == 1)
     74         {
     75             printf("0
    ");
     76             continue;
     77         }
     78         if (n == 2)
     79         {
     80             printf("1
    ");
     81             continue;
     82         }
     83 
     84         node b;
     85         b.a[0][0] = 2;
     86         b.a[0][1] = 1;
     87         b.a[0][2] = -1;
     88         b.a[0][3] = 0;
     89 
     90         b.a[1][0] = 0;
     91         b.a[1][1] = 2;
     92         b.a[1][2] = 0;
     93         b.a[1][3] = 0;
     94 
     95         b.a[2][0] = 0;
     96         b.a[2][1] = 0;
     97         b.a[2][2] = 1;
     98         b.a[2][3] = 1;
     99 
    100         b.a[3][0] = 0;
    101         b.a[3][1] = 0;
    102         b.a[3][2] = 0;
    103         b.a[3][3] = 1;
    104 
    105         node res = quick(b, n - 2);
    106         printf("%lld
    ", (mod * 4 + res.a[0][0] + (res.a[0][1] * 8ll) % mod + res.a[0][2] * 4ll + res.a[0][3] * 1ll) % mod);
    107     }
    108     return 0;
    109 }
    110 
    111 //979641140
    View Code

    Hat-Xor

     Gym - 101962E 

    这个题目有点看不懂

    代码:

     1 #include <algorithm>
     2 #include <cmath>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <cstring>
     6 #include <ctime>
     7 #include <iostream>
     8 #include <map>
     9 #include <queue>
    10 #include <set>
    11 #include <vector>
    12 using namespace std;
    13 typedef long long ll;
    14 const int maxn = 2e5 + 5;
    15 const int mod = 998244353;
    16 const double inf = 100000000005;
    17 void read(int& v) {
    18   int k = 1;
    19   v = 0;
    20   int c = getchar();
    21   while (c < '0' || c > '9') {
    22     if (c == '-')
    23       k = 0;
    24     c = getchar();
    25   }
    26   while (c >= '0' && c <= '9')
    27     v = (v << 3) + (v << 1) + (c - 48), c = getchar();
    28   if (k == 0)
    29     v = -v;
    30 }
    31 int main() {
    32   // int t;
    33   // read(t);
    34   // while (t--) {
    35   string s;
    36   cin >> s;
    37   int n = s.size(), ans = 0;
    38   for (int i = 0; i < n; i++)
    39     ans ^= s[i] - '0';
    40   if (!ans)
    41     puts("YES");
    42   else
    43     puts("NO");
    44   // }
    45 }
    46 /*
    47 6
    48 1 1 1 2
    49 2 3 3 4
    50 3 5 4 6
    51 4 7 8 10
    52 4 7 8 10
    53 4 7 8 10
    54 4
    55 1 2 1 1
    56 1 3 1 2
    57 2 3 2 4
    58 3 3 4 4
    59 */
    View Code

    Rei do Cangaço

     Gym - 101962K 

    题意:

    有n个房子,每一个房子里面有一定价值的财宝(有正有负)。如果你最开始站在第i个房子前,第一次你可以走3步到达i+3房子前,第二次你需要走6步,依次递增。你可以选择把[i,i+移动量)这一部分的房子的财宝都拿走。或者不拿

    当你走过第n个房子就结束,对于每一个起始位置i,输出它的最大获利价值

    题解:

    模拟

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define INF 0x3f3f3f3f;
     5 #define mod 1000000007;
     6 
     7 int a[50010];
     8 int sum[50010];
     9 int main()
    10 {
    11     int n;
    12     scanf("%d", &n);
    13     for (int i = 1; i <= n; i++)
    14         scanf("%d", &a[i]);
    15     for (int i = 1; i <= n; i++)
    16         sum[i] = sum[i - 1] + a[i];
    17     for (int i = 1; i <= n; i++)
    18     {
    19         int ct = 3, pre = i, ans = 0;
    20         for (int j = i + 3;; j += ct)
    21         {
    22             if (sum[min(n, j - 1)] - sum[pre - 1] > 0)
    23             {
    24                 ans += sum[min(n, j - 1)] - sum[pre - 1];
    25             }
    26             pre = j;
    27             ct += 3;
    28             if (j > n)
    29                 break;
    30         }
    31         printf("%d
    ", ans);
    32     }
    33 
    34     return 0;
    35 }
    View Code

    Sorting Machine

     Gym - 101962M 

    题意:

    题目设定对一个区间排序花费是L*log2(K+1)

    题目最开始给你一个倒着的序列a,其值如下:n、n-1、n-2...2、1

    k就是你要排序的区间内ai>ai+1的数对的数量,L就是要排序区间长度

    你要保证对整个区间排序的花费不超过7*n

    对于输出你可以分成多组,前面组先输出表示在前面组已经排过序的基础上进行了下一组的排序

    题解:

    按照建线段树的形式输出线段树前三层就可以了,这个样子的话最后花费是不会超过7n的

    打表也可以验证

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define INF 0x3f3f3f3f;
     5 
     6 struct node
     7 {
     8     int l, r;
     9 } a[10];
    10 int main()
    11 {
    12 
    13 
    14     int n;
    15     scanf("%d", &n);
    16     a[1].l = 1;
    17     a[1].r = n;
    18     int mid = a[1].l + a[1].r >> 1;
    19     a[2].l = 1;
    20     a[2].r = mid;
    21     a[3].l = mid + 1;
    22     a[3].r = n;
    23     mid = a[2].l + a[2].r >> 1;
    24     a[4].l = 1;
    25     a[4].r = mid;
    26     a[5].l = mid + 1;
    27     a[5].r = a[2].r;
    28     mid = a[3].l + a[3].r >> 1;
    29     a[6].l = a[3].l;
    30     a[6].r = mid;
    31     a[7].l = mid + 1;
    32     a[7].r = n;
    33 
    34     printf("%d
    ", 3);
    35     printf("%d
    ", 4);
    36     printf("%d %d
    ", a[4].l, a[4].r);
    37     printf("%d %d
    ", a[5].l, a[5].r);
    38     printf("%d %d
    ", a[6].l, a[6].r);
    39     printf("%d %d
    ", a[7].l, a[7].r);
    40 
    41     printf("%d
    ", 2);
    42     printf("%d %d
    ", a[2].l, a[2].r);
    43     printf("%d %d
    ", a[3].l, a[3].r);
    44 
    45     printf("%d
    ", 1);
    46     printf("%d %d
    ", a[1].l, a[1].r);
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    人脸开锁
    xtrabackup 8.0如何恢复单表
    这样配置,让你的VS Code好用到飞起!
    sqlserver安装教程(sql server2019安装详细步骤)
    史上最全vscode配置使用教程
    CxSAST 安装教程
    AppScan下载、安装、使用教程
    查看mysql数据库表结构注释信息
    从外包增删改查到大厂技术专家,我做对了什么?
    C内存操作API的实现原理
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/14048807.html
Copyright © 2020-2023  润新知