题意:
- 一位选手去参加电视节目,有k位评委打分(按顺序为a1,a2…ak),打分不同时亮出,就会有k次暂时分数(按顺序),但他只记得n个不同的暂时分(无序)。求:有几种可能的初始分数。
规模:
- k and n (1 ≤ n ≤ k ≤ 2 000)
- a1, a2, …, ak ( - 2 000 ≤ ai ≤ 2 000)
- n distinct integers b1, b2, …, bn ( - 4 000 000 ≤ bj ≤ 4 000 000)
类型:
- 思维
分析:
- 当b1的位置确定了,初始值x的大小就确定了,其他b不论如何放置,都不会造成x的取值变化。
- 枚举b1位置,判断是否其他b能够放置,就可以得出这个位置对应的x值是否成立
- 所有成立的b1位置个数就是answer
时间复杂度&&优化:
- o(n*k*logn)
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int MAXN=2005;
int a[MAXN],b[MAXN];
int asum[MAXN];
int n,k;
int main()
{
while(cin>>n>>k){
for(int i=0;i<n;i++){
cin>>a[i];
}
asum[0]=a[0];
for(int i=1;i<n;i++){
asum[i]=a[i]+asum[i-1];
}
sort(asum,asum+n);
n=unique(asum,asum+n)-asum;
for(int i=0;i<k;i++){
cin>>b[i];
}
int ans=n;
for(int i=0;i<n;i++){
int x=b[0]-asum[i];
for(int j=1;j<k;j++){
if(!binary_search(asum,asum+n,b[j]-x)){
ans--;
break;
}
}
}
printf("%d\n",ans);
}
return 0;
}