题意分析
给定一个四元组,四个数分别为a,b,c,d,满足以下条件:
1.a<b<c<d
2.b-a=2*(d-c)
3.b-a=(c-b)/3 //注意是实除
现在给你一个序列X,请你求出序列X中每个数分别作为a,b,c,d的个数。
算法一:暴力枚举(PTS 35)
直接进行一个暴力的打,枚举a,b,c,d,判断是否满足条件,再用四个数组分别记录个数。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,m;
int maho[40010];
bool check(int a,int b,int c,int d)
{
if(a>=b||b>=c||c>=d) return false;
if((b-a)!=2*(d-c)) return false;
if(3*(b-a)>=(c-b)) return false;
return true;
}
struct node{
int aa,bb,cc,dd;
}h[1000010];
int main()
{
memset(h,0,sizeof(h));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
scanf("%d",&maho[i]);
}
for(int d=1;d<=m;++d)
{
for(int c=1;c<=m;++c)
{
for(int b=1;b<=m;++b)
{
for(int a=1;a<=m;++a)
{
if(check(maho[a],maho[b],maho[c],maho[d]))
{
h[a].aa++;h[b].bb++;h[c].cc++;h[d].dd++;
}
}
}
}
}
for(int i=1;i<=m;++i)
{
printf("%d %d %d %d\n",h[i].aa,h[i].bb,h[i].cc,h[i].dd);
}
return 0;
}
时间复杂度: