Color Changing Sofa Gym - 101962B、Renan and Cirque du Soleil Gym - 101962C、Hat-Xor Gym - 101962E 、Rei do Cangaço Gym - 101962K 、Sorting Machine Gym - 101962M

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\n", 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\n");
 76             continue;
 77         }
 78         if (n == 2)
 79         {
 80             printf("1\n");
 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\n", (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\n", 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\n", 3);
35     printf("%d\n", 4);
36     printf("%d %d\n", a[4].l, a[4].r);
37     printf("%d %d\n", a[5].l, a[5].r);
38     printf("%d %d\n", a[6].l, a[6].r);
39     printf("%d %d\n", a[7].l, a[7].r);
40 
41     printf("%d\n", 2);
42     printf("%d %d\n", a[2].l, a[2].r);
43     printf("%d %d\n", a[3].l, a[3].r);
44 
45     printf("%d\n", 1);
46     printf("%d %d\n", a[1].l, a[1].r);
47     return 0;
48 }
View Code

 

posted @ 2020-11-27 16:27  kongbursi  阅读(189)  评论(0编辑  收藏  举报