Codeforces Round #243 (Div. 2)

Contest链接:CF #243(Div. 2) (426)

补题完毕,此文存代码。


// A . Sereja and Mugs
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

int a[111];

int main()
{
    // freopen("in", "r", stdin);
    int n, s, sum = 0;
    scanf("%d%d", &n, &s);
    for(int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
        sum += a[i];
    }
    bool flag = 0;
    for(int i = 0; i < n; ++i) {
        if(sum - a[i] <= s) {
            flag = 1;
            break;
        }
    }
    printf("%s\n", flag ? "YES" : "NO");
    return 0;
}

// B . Sereja and Mirroring
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

const int N = 111, inf = 1111111;
int mat[N][N];
char s[N][N];

int judge(int i, int k)
{
    if(k == 1) return inf;
    if(k & 1) return inf;
    for(int j = i; j < k / 2; ++j) {
        if(strcmp(s[j], s[i + k - 1 - j])) return inf;
    }
    return min(k, min(judge(i, k / 2), judge(k / 2 + 1, i + k - 1)));
}

int main()
{
    // freopen("in", "r", stdin);
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            scanf("%d", &mat[i][j]);
            s[i][j] = mat[i][j] + '0';
        }
        s[i][m] = '\0';
    }
    printf("%d\n", min(n, judge(0, n) / 2));
    return 0;
}

// C . Sereja and Swaps
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;

const int N = 222, inf = (int)1e9;
int a[N];
vector<int> seg(N), tem(N);

bool cmp(const int &a, const int &b) { return a > b; }

int main()
{
    // freopen("in", "r", stdin);
    int n, k;
    scanf("%d%d", &n, &k);
    for(int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
    int mx = -inf;
    for(int i = 0; i < n; ++i) {
        for(int j = i; j < n; ++j) {

            int sum = 0;
            for(int x = i; x <= j; ++x) sum += a[x];

            seg.clear(), tem.clear();
            for(int x = 0; x < i; ++x) tem.push_back(a[x]);
            for(int x = i; x <= j; ++x) seg.push_back(a[x]);
            for(int x = j + 1; x < n; ++x) tem.push_back(a[x]);
            sort(seg.begin(), seg.end());
            sort(tem.begin(), tem.end(), cmp);

            int siz_s = seg.size(), siz_t = tem.size();
            for(int x = 0; x < k && x < siz_s && x < siz_t && tem[x] > seg[x]; ++x) {
                sum += tem[x] - seg[x];
            }
            if(sum > mx) mx = sum;

        }
    }
    printf("%d\n", mx);
    return 0;
}

// D . Sereja and Table
#include <algorithm>
#include <cstdio>
using namespace std;

const int N = 111, inf = (int)1e9;
int a[N][N], c[N];

int main()
{
    // freopen("in", "r", stdin);
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            scanf("%d", &a[i][j]);
        }
    }
    int mx = inf;
    if(n > k) {
        for(int i = 0; i < n; ++i) {
            int tans = 0;
            for(int j = 0; j < n; ++j) {
                int t = 0;
                for(int x = 0; x < m; ++x) {
                    t += (a[i][x] == a[j][x]);
                }
                tans += min(t, m - t);
            }
            mx = min(mx, tans);
        }
    }
    else {
        for(int i = 0; i < (1 << n); ++i) {
            for(int j = 0; j < n; ++j) c[j] = (i >> j) & 1;
            int tans = 0;
            for(int x = 0; x < m; ++x) {
                int t = 0;
                for(int y = 0; y < n; ++y) {
                    t += (c[y] == a[y][x]);
                }
                tans += min(t, n - t);
            }
            mx = min(mx, tans);
        }
    }
    printf("%d\n", mx <= k ? mx : -1);
    return 0;
}

// E . Sereja and Two Sequences
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;

const int N = 111111;
vector<int> v[N];
int a[N], dp[N], ans;

int main()
{
    // freopen("in", "r", stdin);
    int n, m, s, e, b;
    scanf("%d%d%d%d", &n, &m, &s, &e);
    for(int i = 0; i < n; ++i) scanf("%d", &a[i]);
    for(int i = 0; i < m; ++i) scanf("%d", &b), v[b].push_back(i);
    memset(dp, 0x3f, sizeof dp);
    dp[0] = -1;
    for(int i = 0; i < n; ++i) {
        for(int j = s / e; j >= 1; --j) {
            vector<int>::iterator it = upper_bound(v[a[i]].begin(), v[a[i]].end(), dp[j - 1]);
            if(it == v[a[i]].end()) continue;
            dp[j] = min(*it, dp[j]);
            if(i + 1 + dp[j] + 1 + j * e <= s) ans = max(j, ans);
        }
    }
    printf("%d\n", ans);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值