题目连接:http://acm.hi-54.com/problem.php?pid=2110
题意是给了两组数,然后问第一组数中有多少个子数组加任意数或减任意数再任意排序得到第二组数(感觉没说清楚,但大概就是这意思)。
来源:河南省第十一届省赛
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int T,n,m;
int pre[20005];
int ans[15];
int a[15],b[15];
int vis[15];
int Check2(int x,int y){
int num = 0;
for(int i=x;i<=y;i++){
a[num++] = pre[i];
}
for(int i=0;i<m;i++){
b[i] = ans[i];
}
sort(a,a+m);
sort(b,b+m);
memset(vis,0,sizeof(vis));
int flag = a[0] - b[0];
for(int i=0;i<m;i++){
if(b[i] + flag != a[i])return 0;
}
return 1;
}
int main()
{
cin>>T;
while(T--){
cin>>n;
for(int i=0;i<n;i++){
cin>>pre[i];
}
cin>>m;
for(int i=0;i<m;i++){
cin>>ans[i];
}
int sum = 0;
int ans= 0;
for(int i=0;i<=n-m;i++){
if(Check2(i,i+m-1)){
// cout<<"111"<<endl;
// cout<<" "<<i<<endl;
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}