Codeforces Round #302 (Div. 2) A B C

Codeforces Round #302 (Div. 2)

A. Set of Strings

字符串 q 被称为 "beautiful" 当且仅当 q 可以被拆分成 k 个子串 (s1, s2, s3, ... , sk) 并且任意两个字串满足首字母不一样。

直接模拟,对 q 的每个字符进行判断,如果该字符在之前没有出现过,那么从它开始就可以组成一个新的字符串,并且计数,如果到了k 了则把之后的都归为一个字符串。

#include <cstring>
#include <iostream>
using namespace std;

char ans[30][100];

int main () {
    int n;
    string s;
    cin >> n >> s;

    int _n = n;

    int vis[26] = {0};

    int k = 0;

    for (int i=0; i<s.size(); i++) {
        if (vis[s[i] - ‘a‘] == 0) {

            ans[n][k++] = ‘\0‘;

            n--;
            vis[s[i] - ‘a‘] = 1;

            k = 0;
        }

        ans[n][k++] = s[i];

        if (n == 0) {
            int j ;
            for (j=i+1; j<s.size(); j++) {
                ans[n][k++] = s[j];
            }
            ans[n][k++] = ‘\0‘;
            break;
        }
    }

    if (n == 0) {
        cout << "YES" << endl;

        for (int i=_n-1; i>=0; i--) {
            cout << ans[i] << endl;
        }
    }
    else {
        cout << "NO" << endl;
    }
    return 0;
}

B. Sea and Islands

问在一个n*n的海域里面是否可以有k个小岛。小岛的定义是岛上的所有点都连在一起,点只有四个方向连在一起。

要尽可能的安排下最多的岛屿,那就得让每个小岛要最小,所以就一个点好吧。问题变成的在n*n的方格里面安排k个方格,并使其不相领。(这题的题意说的真难懂)

#include <iostream>
using namespace std;

char s[101][101];

int main () {
    int n;
    int k;

    cin >> n >> k;

    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            s[i][j] = ‘S‘;
        }
    }

    int cnt = 0;
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            if (cnt == k) continue;
            if (i%2 == j%2) {
                s[i][j] = ‘L‘;
                cnt++;
            }
        }
    }

    if (cnt == k) {
        cout << "YES" << endl;
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                cout << s[i][j] ;
            }
            cout << endl;
        }
    } else {
        cout << "NO" << endl;
    }

    return 0;
}

C. Writing Code

安排n个人写m行代码,每个人每行会出a[i]个bug,求最多出现b个bug的方案数。

一个二维的完全背包,每个人有两个状态:写j行代码出k个bug

dp[i][j][k] 前i个程序员写钱j行出现k个bug的方案数。

dp[i][j][k] = dp[i][j-1][k-a[i]] + dp[i-1][j][k];

注意这里数组会超内存,需要用滚动数组。

#include <iostream>
using namespace std;

int n, m, b;
long long mod;

long long a[505];

long long dp[2][505][505];

int main () {

    cin >> n >> m >> b >> mod;

    for (int i=1; i<=n; i++) {
        cin >> a[i];
    }

    for (int i=1; i<=n; i++) dp[i % 2][0][0] = 1L;

    for (int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            for (int k=0; k<=b; k++) {
                if (k < a[i]) dp[i % 2][j][k] = dp[(i-1) % 2][j][k] % mod;
                else dp[i % 2][j][k] = (dp[i % 2][j-1][k - a[i]] + dp[(i-1) % 2][j][k]) % mod;
            }
        }
    }

    long long ans = 0;

    for (int i=0; i<=b; i++) {
        ans = (ans + dp[n % 2][m][i]) % mod;
    }

    cout << ans % mod << endl;

    return 0;
}

时间: 2024-11-05 22:28:48

Codeforces Round #302 (Div. 2) A B C的相关文章

水题 Codeforces Round #302 (Div. 2) A Set of Strings

题目传送门 1 /* 2 题意:一个字符串分割成k段,每段开头字母不相同 3 水题:记录每个字母出现的次数,每一次分割把首字母的次数降为0,最后一段直接全部输出 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <cstring> 8 #include <string> 9 #include <algorithm> 10 using namespace std; 11 12 con

完全背包 Codeforces Round #302 (Div. 2) C Writing Code

题目传送门 1 /* 2 题意:n个程序员,每个人每行写a[i]个bug,现在写m行,最多出现b个bug,问可能的方案有几个 3 完全背包:dp[i][j][k] 表示i个人,j行,k个bug dp[0][0][0] = 1 表示不选择人的时候所有的bug的种类犯错误都只有一种 4 dp[i][j][k] += dp[i%2][j-1][k-a[i]]: 5 错误示范:dp[i][j][k] += dp[i-1][j-l][k-l*a[i]]; 其实要从上一行的状态推出,即少一行 6 内存限制,

Codeforces Round #302 (Div. 2) -- (A,B,C)

题目传送:Codeforces Round #302 (Div. 2) A. Set of Strings 思路:注意开头字母都不相同 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include &

Codeforces Round #302 (Div. 1 D)

http://codeforces.ru/contest/543/problem/D Problem 给一棵树,n个节点,n-1条边.把每个点当作首都,输出一个结果,一共要输出n个结果.边有两种形态,一种是好边,一种是坏边,当把一个点当作首都的时候,要求这个点到每个点的路径上坏边总数<=1,问有多少种树的形态. n: 10^5级别 Solution 很显然树形dp.设dp[i]表示,以 i 为根的子树的方案数.如果只需要算dp[1],直接dfs一遍,回溯的时候,dp[i]=∏(dp[j]+1),

Codeforces Round #302 (Div. 1 A)

http://codeforces.ru/contest/543/problem/A Problem N个人写代码,a[i]表示第i个人,写一行代码会出现a[i]个bug(不多也不少).现在问,N个人总共写M行,出现bug总数不超过b的方案数(允许有人一行也不写) 数据范围 N,M,b,a[i] : [1,500] Solution 先考虑最直接的dp.dp[i][j][k]表示前i个人,写了j 行,出现k个bug的方案数,那么转移,dp[i][j+j1][k+j1*a[i]]+=dp[i][j

Codeforces Round #302 (Div. 2) (ABCD题解)

比赛链接:http://codeforces.com/contest/544 A. Set of Strings time limit per test:1 second memory limit per test:256 megabytes You are given a string q. A sequence of k strings s1,?s2,?...,?sk is called beautiful, if the concatenation of these strings is

Codeforces Round #302 (Div. 1)

A题是个背包问题.给你n个一行代码,第 i 代码写的时候会产生 ai 个bug,要写 m 行,总的bug不能超过 b 个,问有多少种方案,对mod取模. dp[i][j][k] = (dp[i-1][j][k] + dp[i][j-1][k-a[i]]) % mod; 表示不选第 i 个的话就有 dp[i-1][j][k], 选第 i 个就有 dp[i][j-1][k-a[i]]种方案.滚动数组节省空间 1 #include <iostream> 2 #include <cstdio&g

Codeforces Round #302 (Div. 2) D. Destroying Roads 最短路 删边

题目:有n个城镇,m条边权为1的双向边让你破坏最多的道路,使得从s1到t1,从s2到t2的距离分别不超过d1和d2. #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <stack> #in

Codeforces Round #302 (Div. 2)——C dp—— Writing Code

Programmers working on a large project have just received a task to write exactly m lines of code. There are n programmers working on a project, the i-th of them makes exactly ai bugs in every line of code that he writes. Let's call a sequence of non