POJ 1868 Antiarithmetic?

題意:給定一個長爲n的(0,1,2....n-1)的排列,問是否存在等差數列。

題解:可以記錄每個數出現的位置pos[i],枚舉等差數列中間項以及公差,判斷(pos[i+d]-pos[i])*(pos[i-d]-pos[i])是否小於0。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=10005;
int pos[N];
int main()
{
    int n,f;
    while(scanf("%d",&n),n)
    {
        getchar();
        for(int i=0,tp;i<n;i++)
        {
            scanf("%d",&tp);
            pos[tp]=i;
        }
        f=0;
        for(int i=1;!f&&i<n-1;i++)
            for(int j=1,lim=min(n-1-i,i);!f&&j<=lim;j++)
                if((pos[i+j]-pos[i])*(pos[i-j]-pos[i])<0)
                    f=1;
        printf("%s\n",f?"no":"yes");
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章