CodeForces

来源:互联网 发布:求生之路2不用网络 编辑:程序博客网 时间:2024/06/06 18:09

题目链接:CodeForces - 831C

题意:有人去面试,他有一个原始成绩,然后k个评委依次打分,但是他没有记住每个评委给他打分后的总分,只记得所有评委打的k个分数和n个不同的总分,现在问你他的原始成绩有多少种可能取值

思路:先将评委的k个评分前缀和排序去重,然后枚举所有可能的原始成绩,如果所有记录的分数都能由该原始成绩加某个前缀和得到,那么该原始成绩就符合条件;
判断成绩是否符合条件可以用二分,也可以用set判断;
下面用vector结合map映射也OK~

#include<iostream>#include<cstdio>#include<algorithm>#include<vector>#include<map>using namespace std;#define maxn 2010int a[maxn];vector<int>v;map<int,int>m;int main(){    int n,k,x;    cin>>k>>n;    cin>>a[0];    for(int i=1; i<k; i++)    {        cin>>x;        a[i]=a[i-1]+x;    }    sort(a,a+k);    int len=unique(a,a+k)-a;    for(int i=0; i<n; i++)    {        cin>>x;        for(int j=0; j<len; j++)           v.push_back(x-a[j]);    }    sort(v.begin(),v.end());    for(int i=0; i<v.size(); i++)    {        m[v[i]]++;    }    int sum=0;    for(int i=0; i<v.size(); i++)    {        if(m[v[i]]>=n) {sum++; m[v[i]]=0;}    }    cout<<sum<<endl;    return 0;}