题意:一个比赛中,n裁判依次给你打分,第i个裁判给了A[i]分,但你记性不好,没有记住所有得分,连初始分都忘记了,只记得m个加完分后的总分B[i](不是按顺序的),且B[i]互不相同。问:初始分有多少种可能的情况。点击打开链接
#include <iostream>
#include <cstdio>
#include<algorithm>
#include <cstring>
using namespace std;
int main()
{
int n,k;
int a[2005],b[2005],c[2005];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin>>k>>n;
for(int i=1;i<=k;++i)
{
scanf("%d",&a[i]);
c[i]=a[i];
a[i]+=a[i-1];
}
sort(a+1,a+k+1);
k=unique(a+1,a+k+1)-a-1;
for(int i=1;i<=n;++i)
scanf("%d",&b[i]);
int score,flag,ans=0,ant,tag;
for(int i=1;i<=k;++i)
{
score=b[1]-a[i];
ant=0;
for(int j=1;j<=n;++j)
{
tag = b[j]-score;
if(binary_search(a+1,a+k+1,tag))
{
ant++;
}
else
break;
}
if(ant==n)
ans++;
}
cout<<ans<<endl;
return 0;
}
#include <iostream>
#include <cstdio>
#include<algorithm>
#include <cstring>
using namespace std;
int main()
{
int n,k;
int a[2005],b[2005],c[2005];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin>>k>>n;
for(int i=1;i<=k;++i)
{
scanf("%d",&a[i]);
c[i]=a[i];
a[i]+=a[i-1];
}
sort(a+1,a+k+1);
k=unique(a+1,a+k+1)-a-1;
for(int i=1;i<=n;++i)
scanf("%d",&b[i]);
int score,flag,ans=0,ant=0,tag;
for(int i=1;i<=k;++i)
{
score=b[1]-a[i];
ant=0;
for(int j=1;j<=n;++j)
{
tag = b[j]-score;
flag=0;
for(int q=1;q<=k;++q)
{
if(tag==a[q])
{
ant++;
flag=1;
break;
}
}
if(!flag)
break;
}
if(ant==n)
ans++;
}
cout<<ans<<endl;
return 0;
}