Codeforces Round #480 (Div. 2)

Contests 链接:Codeforces Round #480 (Div. 2)
过题数:3
排名:804/9913

题意

给定一个只包含 -o 的字符串,- 表示项链上的链,o 表示项链上的珍珠,将字符串首尾相连表示一条项链,每次操作可以将任意位置的链或珍珠拆下,插入到另一个位置上,问进行任意多次操作后,能否使得项链上任意两个相邻的珍珠之间的链的数量相等。

输入

输入为一个字符串 s (3|s|100) s   ( 3 ≤ | s | ≤ 100 ) ,字符串只包含字符 -o

输出

如果可以,则输出 YES Y E S ,否则输出 NO N O ,大小写任意。

样例

输入
-o-o--
输出
YES
输入
-o---
输出
YES
输入
-o---o-
输出
NO
输入
ooo
输出
YES

题解

计算项链上 o 的数量 cnto c n t o - 的数量 cnt c n t − ,满足 cnt c n t − cnto c n t o 的倍数或者 cnto c n t o 的数量为 0 0 ,就输出 YES Y E S ,否则输出 NO N O

过题代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define LL long long
const int maxn = 100 + 100;
int cnt1, cnt2;
char str[maxn];

int main() {
    #ifdef LOCAL
    freopen("test.txt", "r", stdin);
//    freopen("testout.txt", "w", stdout);
    #endif // LOCAL
    ios::sync_with_stdio(false);

    while(scanf("%s", str) != EOF) {
        cnt1 = cnt2 = 0;
        for(int i = 0; str[i]; ++i) {
            if(str[i] == 'o') {
                ++cnt1;
            } else {
                ++cnt2;
            }
        }
        if(cnt1 == 0) {
            printf("YES\n");
            continue;
        }
        if(cnt2 % cnt1 == 0) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }

    return 0;
}

B. Marlin

题意

在一个 4×n 4 × n n n 为奇数)的网格中,需要设置 k k 个障碍,这 k k 个障碍不能设置在网格的边界上,要求从 (1,1) ( 1 , 1 ) 到达 (4,n) ( 4 , n ) 的最短路径数量等于从 (4,1) ( 4 , 1 ) (1,n) ( 1 , n ) 的最短路径数量,两个方格之间的路径长度为 1 1 ,当且仅当这两个方格有公共边。

输入

输入只包含两个整数 n,k (3n99,0k2×(n2)) n , k   ( 3 ≤ n ≤ 99 , 0 ≤ k ≤ 2 × ( n − 2 ) ) ,数据保证 n n 为奇数。

输出

如果可以达到要求,第一行输出 YES Y E S ,接下去 4 4 行每行 n n 个字符,字符只能包含 .#,其中 . 表示空地,# 表示障碍物。

样例

输入
7 2
输出
YES
.......
.#.....
.#.....
.......
输入
5 3
输出
YES
.....
.###.
.....
.....

题解

对于 k k 为偶数的情况,只需要上下对称分布,对于奇数的情况,以下枚举了 n=5 n = 5 时, k k 等于 1,3,5 1 , 3 , 5 的构造方案:
.....                             .....                             .....
..#..                             .###.                             .###.
.....                             .....                             .#.#.
.....                             .....                             .....
不存在无法构造的情况。

过题代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define LL long long
const int maxn = 100 + 100;
int n, k;
char ans[maxn][maxn];

int main() {
    #ifdef LOCAL
    freopen("test.txt", "r", stdin);
//    freopen("testout.txt", "w", stdout);
    #endif // LOCAL
    ios::sync_with_stdio(false);

    while(scanf("%d%d", &n, &k) != EOF) {
        for(int i = 1; i <= 4; ++i) {
            for(int j = 1; j <= n; ++j) {
                ans[i][j] = '.';
            }
        }
        if(k % 2 == 0) {
            for(int j = 2; j < k / 2 + 2; ++j) {
                for(int i = 2; i <= 3; ++i) {
                    ans[i][j] = '#';
                }
            }
        } else {
            int up = min(n - 2, k);
            int mid = n / 2 + 1;
            for(int i = 0; i <= up / 2; ++i) {
                ans[2][mid + i] = '#';
                ans[2][mid - i] = '#';
            }
            up = max(k - (n - 2), 0);
            for(int i = 0; i < up / 2; ++i) {
                ans[3][2 + i] = '#';
                ans[3][n - 1 - i] = '#';
            }
        }
        printf("YES\n");
        for(int i = 1; i <= 4; ++i) {
            for(int j = 1; j <= n; ++j) {
                printf("%c", ans[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

C. Posterized

题意

给出 n n 个整数和一个阈值 k k ,所有整数都在 [0,255] [ 0 , 255 ] 的范围内,要求将所有整数分到一个不阈值大于 k k 的区间内,并从这个阈值内选出一个数字代表这个阈值中的所有数字, [0,255] [ 0 , 255 ] 内每个整数都只能属于一个阈值,问将 n n 个整数都用所属阈值的代表数字替换后,字典序最小的结果。

输入

第一行为两个整数 n,k (1n105,1k256) n , k   ( 1 ≤ n ≤ 10 5 , 1 ≤ k ≤ 256 ) ,第二行为 n n 个整数 p1,p2,,pn (0pi255) p 1 , p 2 , ⋯ , p n   ( 0 ≤ p i ≤ 255 )

输出

输出字典序最小的结果。

样例

输入
4 3
2 14 3 4
输出
0 12 3 3
提示
2 2 属于 [0,2] [ 0 , 2 ] ,代表数字为 0 0 14 14 属于 [12,14] [ 12 , 14 ] ,代表数字为 12 12 3,4 3 , 4 属于 [3,5] [ 3 , 5 ] ,代表数字为 3 3 ,即得到最小字典序结果。
输入
5 2
0 2 1 255 254
输出
0 1 1 254 254

题解

最初每个数字都属于自身阈值(长度为 1 1 ),从前往后,每碰到一个数字,先检查这个数字是否已经属于某一个阈值,如果已经属于,则只能用该阈值的代表数字替换,否则往前找 k1 k − 1 个数字,保证前 x (xk1) x   ( x ≤ k − 1 ) 个数字都没有属于某阈值的情况下,贪心地找到最小的能代表的数字,将这一段的代表数字同设置为该数字,一直往后。

过题代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define LL long long
const int maxn = 100000 + 100;
int n, k;
int num[maxn];
int head[1000];

int Find(int x) {
    int ret = x;
    int kk = k;
    while(ret != 0) {
        --ret;
        --kk;
        if(head[ret] != -1) {
            ++ret;
            break;
        }
        if(kk == 0) {
            ++ret;
            break;
        }
    }
    if(ret == 0) {
        return ret;
    }
    if(x - head[ret - 1] + 1 <= k) {
        return head[ret - 1];
    } else {
        return ret;
    }
}

int main() {
    #ifdef LOCAL
    freopen("test.txt", "r", stdin);
//    freopen("testout.txt", "w", stdout);
    #endif // LOCAL
    ios::sync_with_stdio(false);

    while(scanf("%d%d", &n, &k) != EOF) {
        memset(head, -1, sizeof(head));
        for(int i = 1; i <= n; ++i) {
            scanf("%d", &num[i]);
            if(head[num[i]] != -1) {
                continue;
            }
            int Index = Find(num[i]);
            for(int j = Index; j <= num[i]; ++j) {
                head[j] = Index;
            }
        }
        for(int i = 1; i <= n; ++i) {
            if(i != 1) {
                printf(" ");
            }
            printf("%d", head[num[i]]);
        }
        printf("\n");
    }

    return 0;
}

你可能感兴趣的:(Codeforces)