• Codeforces Round #356 (Div. 2)


    5/5

    懒啊懒啊~~屯了一堆题没补,GG……

    最近要期末考试,博客也搁置很久没有更新了,虽然更新也没人看,但是还是要定期写点东西。

    水了一场CF,最大的感想是CF红名果然很难,但是坚持打更重要,所以不要以实力不够为借口,每次还是爆一下肝肛一下CF,万一红名了呢?

    在这里我决定每次新的一场CF出来之前,都把题目补好,然后迎接新的CF,最近真的没时间刷题orz,这么蒟蒻还不刷题QAQ

     

    题A Bear and Five Cards

    题意:只允许移动两个或者三个相同的t,然后问你剩下最小的和是多少?

    题解:水题。

     1 /*zhen hao*/
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 #define lson l, m, rt*2
     6 #define rson m + 1, r, rt*2+1
     7 #define xx first
     8 #define yy second
     9 
    10 typedef pair<int,int> pii;
    11 typedef long long ll;
    12 typedef unsigned long long ull;
    13 
    14 int t[110];
    15 
    16 int main() {
    17 //  freopen("case.in", "r", stdin);
    18   int res = 0;
    19   for (int i = 0; i < 5; i++) {
    20     int x;
    21     scanf("%d", &x);
    22     t[x]++;
    23     res += x;
    24   }
    25   int tmp = res;
    26   for (int i = 0; i <= 100; i++) if (t[i] >= 2) {
    27 //    cout << i << ' ' << t[i] << endl;
    28     res = min(res, tmp - i * min(3, t[i]));
    29   }
    30   cout << res << endl;
    31   return 0;
    32 }
    代码君

     

    题B Bear and Finding Criminals

    题意:给你一串序列,1代表有罪犯,0代表没有,然后给你一个城市a,问你a有多少个距离它的两边的罪犯是确定有的,也就是两边都是1的个数,问你最多能抓多少个罪犯?

    题解:简易地说就是统计两边有多少个都是1,然后如果有一边没有就直接统计1的个数。

     

     1 /*zhen hao*/
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 #define lson l, m, rt*2
     6 #define rson m + 1, r, rt*2+1
     7 #define xx first
     8 #define yy second
     9 
    10 typedef pair<int,int> pii;
    11 typedef long long ll;
    12 typedef unsigned long long ull;
    13 
    14 const int maxn = 110;
    15 int ok[maxn];
    16 
    17 int main() {
    18 //  freopen("case.in", "r", stdin);
    19   int n, a;
    20   cin >> n >> a;
    21   for (int i = 1; i <= n; i++) {
    22     cin >> ok[i];
    23   }
    24   int len = min(a - 1, n - a), res = 0;
    25   for (int i = 0; i <= len; i++) {
    26     if (ok[a + i] & ok[a - i]) {
    27       res += (i == 0 ? 1 : 2);
    28     }
    29   }
    30   for (int i = 1; i <= n; i++) if (abs(i - a) > len && ok[i]) {
    31     res++;
    32   }
    33   cout << res << endl;
    34   return 0;
    35 }
    代码君

     

    题C Bear and Prime 100

    题意:这是一道人机互动的题目,给你最多20个提问的机会,然后你问一个数是不是要猜的数的因子,然后读取输入是或者不是,然后提问完之后告诉它这个数是不是素数?

    题解:对于2~50的素数,如果都没有,显然是素数,因为后面的素数不可能有其他因子,因为这样会超过100,如果有两个,那么显然不是素数,如果只有一个,还要提问一次,因为不确定是p还是p ^ k,所以只要询问有没有是不是p ^ 2作为因子即可。

     

     1 /*zhen hao*/
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 #define lson l, m, rt*2
     6 #define rson m + 1, r, rt*2+1
     7 #define xx first
     8 #define yy second
     9 
    10 typedef pair<int,int> pii;
    11 typedef long long ll;
    12 typedef unsigned long long ull;
    13 
    14 const int maxn = 110;
    15 int ok[maxn], prime[maxn];
    16 
    17 int main() {
    18 //  freopen("case.in", "r", stdin);
    19 
    20   for (int i = 2; i <= 100; i++) if (!ok[i])
    21     for (int j = i + i; j <= 100; j += i) ok[j] = 1;
    22 
    23   int yes = 0, p;
    24 
    25   for (int i = 2; i <= 50; i++) if (!ok[i]) {
    26     printf("%d
    ", i);
    27     fflush(stdout);
    28     char s[100];
    29     scanf("%s", s);
    30     if (strcmp(s, "yes") == 0) { yes++; p = i; }
    31     if (yes >= 2) break;
    32   }
    33 
    34   int flag = 0;
    35   if (yes >= 2) flag = 1;
    36   else if (yes == 1 && p * p <= 100) {
    37     printf("%d
    ", p * p);
    38     fflush(stdout);
    39     char s[100];
    40     scanf("%s", s);
    41     if (strcmp(s, "yes") == 0) flag = 1;
    42   }
    43 
    44   flag ? puts("composite") : puts("prime");
    45   fflush(stdout);
    46 
    47   return 0;
    48 }
    代码君

     

    题D Bear and Tower of Cubes

    题意:给你一个数m,然后求一个数x在[0,m]中,然后定义一个计算方式:贪心取最接近的立方数,减去,在贪心取,直到为0。然后这个计算得出的结果要最大,问你满足这个计算得到最大的结果同时x要最大是多少?

    题解:蒟蒻不会构造,所以参照了官方题解。

    题解表示假设x最近的一个立方数是a,那么x肯定要么是由a或者a - 1来的,如果是有a来的,那么剩余就是m - a^3;如果是由a-1来的,那么肯定不能是m,只能是a^3-1,所以剩余就是a^3-1-(a-1)^3,然后就这样递归下去,据说最多的一层是18,所以放心递归。

     

     1 /*zhen hao*/
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 typedef long long ll;
     6 pair<int,ll> res;
     7 
     8 ll my_pow(ll x) {
     9   return x * x * x;
    10 }
    11 
    12 void dfs(ll cur, int step, ll from) {
    13   if (cur == 0) {
    14     res = max(res, make_pair(step, from));
    15     return;
    16   }
    17   ll x = 1;
    18   while (my_pow(x + 1) <= cur) ++x;
    19   dfs(cur - my_pow(x), step + 1, from + my_pow(x));
    20   if (x - 1 >= 0)
    21     dfs(my_pow(x) - my_pow(x - 1) - 1, step + 1, from + my_pow(x - 1));
    22 }
    23 
    24 int main() {
    25 //  freopen("case.in", "r", stdin);
    26   ll n;
    27   cin >> n;
    28   dfs(n, 0, 0);
    29   cout << res.first << ' ' << res.second << endl;
    30 }
    代码君

     

    题E Bear and Square Grid

    题意:给你个n * n的迷宫,x表示障碍,。表示不是障碍,然后就可以割出一个k*k的空间使得这个空间的点都变成不是障碍,问你最大的连通的不是障碍的个数是多少?

    题解:如果暴力显然是n^4,n^2枚举这个空间肯定是要的,现在要做的是怎样O(n)地求出当前多出来的连通块的个数,我们实际上只要维护边界的即可。也就是说先固定一个k*k的空间,然后当前答案是k*k,然后把空间内的每个格子所在的连通块的size都减一,然后对于边界我们就求一下连通块的个数即可,注意要标记一下,计算过的不要重复计算,学习一下CF上大神的代码。

     

     1 /*zhen hao*/
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 const int maxn = 510, dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
     6 char maze[maxn][maxn];
     7 int n, k;
     8 int id[maxn][maxn], size[maxn * maxn], cur[maxn * maxn];
     9 
    10 bool inside(int x, int y) {
    11   return x >= 0 && x < n && y >= 0 && y < n;
    12 }
    13 
    14 void dfs(int x, int y, int num) {
    15   id[x][y] = num;
    16   size[num]++;
    17   for (int i = 0; i < 4; i++) {
    18     int xx = x + dx[i], yy = y + dy[i];
    19     if (inside(xx, yy) && maze[xx][yy] == '.' && id[xx][yy] == 0)
    20       dfs(xx, yy, num);
    21   }
    22 }
    23 
    24 void add(int x, int y, int& now, int current) {
    25   if (inside(x,y) && maze[x][y] == '.') {
    26     int i = id[x][y];
    27     if (cur[i] != current) {
    28       cur[i] = current;
    29       now += size[i];
    30     }
    31   }
    32 }
    33 
    34 int main() {
    35 //  freopen("case.in", "r", stdin);
    36   cin >> n >> k;
    37   for (int i = 0; i < n; i++) {
    38     scanf("%s", maze[i]);
    39   }
    40   int cnt = 0;
    41   for (int i = 0; i < n; i++)
    42     for (int j = 0; j < n; j++)
    43       if (maze[i][j] == '.' && id[i][j] == 0) dfs(i, j, ++cnt);
    44 
    45   int best = 0, current = 0;
    46   for (int nowx = 0; nowx + k <= n; nowx++) {
    47     for (int x = nowx; x < nowx + k; x++) for (int y = 0; y < k; y++) --size[id[x][y]];
    48     for (int nowy = 0; nowy + k <= n; nowy++) {
    49       int now = k * k;
    50       current++;
    51       for (int x = nowx; x < nowx + k; x++) {
    52         add(x, nowy - 1, now, current);
    53         add(x, nowy + k, now, current);
    54       }
    55       for (int y = nowy; y < nowy + k; y++) {
    56         add(nowx - 1, y, now, current);
    57         add(nowx + k, y, now, current);
    58       }
    59       best = max(best, now);
    60       if (nowy + k != n) {
    61         for (int x = nowx; x < nowx + k; x++) {
    62           ++size[id[x][nowy]];
    63           --size[id[x][nowy + k]];
    64         }
    65       }
    66     }
    67     for (int x = nowx; x < nowx + k; x++) for (int y = n - k; y < n; y++) ++size[id[x][y]];
    68   }
    69   cout << best << endl;
    70 }
    代码君
  • 相关阅读:
    HDU 2078 复习时间
    HDU 2076 夹角有多大
    邮票(codevs 2033)
    特种部队(codevs 1427)
    小a和uim之大逃离(洛谷 1373)
    地铁间谍(洛谷 2583)
    推销员(codevs 5126)
    小朋友的数字(codevs 3293)
    车站分级(洛谷 1983)
    Code(poj 17801)
  • 原文地址:https://www.cnblogs.com/zhenhao1/p/5589220.html
Copyright © 2020-2023  润新知