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
原文地址:https://www.cnblogs.com/liuweimingcprogram/p/7171266.html