Codeforces 831 C Jury Marks

来源:互联网 发布:优学派软件下载 编辑:程序博客网 时间:2024/06/14 15:03

题目地址:http://codeforces.com/contest/831/problem/C
题意:Polycarp看电视节目,n个评委给参赛选手打分,分别为a1~an。Polycarp 没有记住该位选手的初始分(按时间顺序),只知道m个中间分(不是按时间的顺序),让你求出有多少种初始分。
思路:求出a的前缀和,然后排序,每次以b[0]-a[i]为初始值,然后遍历所有情况,如果全部b都能匹配,就说明该初始值正确,再放入set中去重。

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#define LL long long #define N 2010#define M 50010#define inf 0x3f3f3f3fusing namespace std;const LL mod = 1e9 + 7;const double eps = 1e-9;LL a[N], b[N];set<int> s;int main() {    cin.sync_with_stdio(false);    int n, m, q;    while (cin >> n >> m) {        s.clear();        for (int i = 0; i < n; i++) {            cin >> a[i];        }        for (int i = 1; i < n; i++) {            a[i] += a[i - 1];        }        for (int i = 0; i < m; i++) {            cin >> b[i];        }        sort(a, a + n);        sort(b, b + m);        int mvp;        int j, u;        for (int i = 0; i <= n - m; i++) {            mvp = b[0] - a[i];            for (j = 1, u = i + 1; j < m&&u < n;) {                if (b[j] - a[u] == mvp) {                    j++;                    u++;                }                else {                    u++;                }            }            if (j == m) {                s.insert(mvp);            }        }        cout << s.size() << endl;    }    return 0;}
原创粉丝点击