zoukankan      html  css  js  c++  java
  • C. Jury Marks 思维题

    http://codeforces.com/contest/831/problem/C

    做的时候想不到,来了个暴力。

    对于每个b[i],枚举每一个a[i],就有1个可能的情况。

    然后用vector存起来,再判断。理论复杂度爆咋,过了综测717ms

    正确的思路就是排一个序。

    预处理前缀和suma_i,然后就相当于每一个数字只能选一次。从小到大排序。

    从大到小排序b_i,枚举每一个suma_i,用b[1]确定一个初始值,然后跑完所有b_i,看看suma_i那里有没有就行了。

    #include <bits/stdc++.h>
    #define IOS ios::sync_with_stdio(false)
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    int a[2222], b[2222];
    const int maxn = 8e6 + 20;
    map<int, bool> vis;
    vector<int>vc;
    int sum[2222];
    bool cmp(int a, int b) {
        return a > b;
    }
    void work() {
        int n, k;
        scanf("%d%d", &k, &n);
        for (int i = 1; i <= k; ++i) {
            scanf("%d", a + i);
            sum[i] = sum[i - 1] + a[i];
            vis[sum[i]] = true;
        }
        for (int i = 1; i <= n; ++i) {
            scanf("%d", b + i);
        }
        sort(sum + 1, sum + 1 + k);
        sort(b + 1, b + 1 + n, cmp);
        int ans = 0;
        for (int i = 1; i <= k; ++i) {
            if (i > 1 && sum[i] == sum[i - 1]) continue;
            int val = b[1] - sum[i];
            bool flag = true;
            for (int j = 2; j <= n; ++j) {
                if (!vis[b[j] - val]) {
                    flag = false;
                    break;
                }
            }
            ans += flag;
        }
        cout << ans << endl;
    }
    
    int main() {
    #ifdef local
        freopen("data.txt", "r", stdin);
    //    freopen("data.txt", "w", stdout);
    #endif
        work();
        return 0;
    }
    View Code
  • 相关阅读:
    Shell中判断语句if中-z至-d的意思
    每日英语-20171129
    THINK PHP 学习笔记20171115
    每日英语-20171115
    git bash安装和基本设置
    Centos6.8搭建Git服务(git版本可选)
    一键安装lamp环境出现的问题
    用PHP实现反向代理服务器
    动词的过去式、过去分词、现在分词
    树莓派 中文
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/7171266.html
Copyright © 2011-2022 走看看