题型:简单题
题意:
有n个数,a1, a2, ..., an,现在想要找到所有的x,x满足:
1、x出现在这n个数中;
2、每一次出现的x的下标要满足等差数列。
按升序求出所有的x和x下标满足的公差d,如果x只出现一次,则d输出0。
样例解释:
8
1 2 1 3 1 2 1 5
下标:0 1 2 3 4 5 6 7
总共有4个满足条件的数,
1出现的下标为0 2 4 6,公差为2
2出现的下标为1 5,公差为4
3出现了一次,d为0
5出现了一次,d为0
所以输出; 4
1 2
2 4
3 0
5 0
分析:
为了控制在O(n)时间内,用结构体保存这n个数及其下标,进行排序,然后再将数组扫一遍即可完成。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<cstdlib> using namespace std; struct node{ int h,id; }x[123456]; bool cmp(node a,node b){ if(a.h == b.h) return a.id < b.id; else return a.h < b.h; } int v[123456],w[123456]; int main(){ int n; while(~scanf("%d",&n)){ memset(v,0,sizeof(v)); memset(w,0,sizeof(w)); for(int i=0;i<n;i++){ scanf("%d",&x[i].h); x[i].id=i; } x[n].h=9999999; x[n].id=n; n++; sort(x,x+n,cmp); /* for(int i=0;i<n;i++){ printf("%d %d\n",x[i].h,x[i].id); } cout<<endl; */ int cnt=1,iid=0,d=x[1].id-x[0].id; bool flag=true; for(int i=1;i<n;i++){ if(x[i].h!=x[i-1].h){ if(flag){ v[iid]=x[i-1].h; if(cnt==1) w[iid]=0; else w[iid]=d; iid++; } cnt=1; flag=true; d=x[i+1].id-x[i].id; } else{ if(flag){ if(d != x[i].id-x[i-1].id){ flag=false; continue; } else cnt++; } } } printf("%d\n",iid); for(int i=0;i<iid;i++){ printf("%d %d\n",v[i],w[i]); } } return 0; }