Codeforces Round #424 C

Jury Marks

题意:有一个初始分数x,有n个评委按顺序打分a[i](在x的基础上加或者减),过程中有k个分数被记住了b[i],求有多少种可能的分数

思路:如果是一种可能的分数,那么必然bi在a中都可以被找到,必然b1一定能在a中找到,所以枚举b1=ai,判断是否所有的bi都在ai中出现过,如果是,ans++

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define ll long long
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a) memset(a,0,sizeof(a))
#define mp(x,y) make_pair(x,y)
using namespace std;
const long long INF = 1e18+1LL;
const int inf = 1e9+1e8;
const int N=1e5+100;

int k,n,a[2005],b[2005],ans;
map<int,int> M;
set<int> se;
bool check(int x){
    for(auto j :se){
        M[x+j]=1;
    }
    for(int i=1; i<=n; ++i){
        if(M[b[i]]==0) return 0;
    }
    return 1;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>k>>n;
    for(int i=1; i<=k; ++i){
        cin>>a[i];
        if(i>1) a[i]+=a[i-1];
        se.insert(a[i]);
    }
    for(int i=1; i<=n; ++i){
        cin>>b[i];
    }
    for(auto j :se){
        int x=b[1]-j;
        if(check(x)) ans++;
        M.clear();
    }
    cout<<ans;
    return 0;
}

 

posted on 2017-07-16 19:59  lazzzy  阅读(203)  评论(0编辑  收藏  举报

导航