1.17D補好思路

 

思路補充在註釋裏.

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int q[1000],p[1000],num[1000];
int fmin(int a,int b)
{
    if(a<b)
    return a;
    return b;
}
int fabs(int a)
{
    if(a<0)
    return -a;
    return a;
}
bool cmp(int a,int b)// 通過這個函數可以使數據按從小到大進行排列
{
    return a<b;
}
int main()
{
    int n,m,s,e,l,r,i,minn;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        minn=1000000000;
         s=0,e=-1,l=0,r=-1;
        for(i=0;i<m;i++)
        {
            scanf("%d",&num[i]);
        }
        sort(num,num+m,cmp);
        for(i=0;i<m;i++)
        {
            while(s<=e&&num[i]>=num[q[e]])
            {
                e--;
            }
            q[++e]=i;//實現q[0]=i,不斷賦給新的i值。
            while(s<=e&&i-q[s]>=n)//s=0
            {
                s++;
            }
            while(l<=r&&num[i]<=num[p[r]])
            {
               r--;
            }//此循環不會執行;理由:num[i]會大於num[p[r]]。
            p[++r]=i;//故而p[0]=0,即p[i]=i。
            while(l<=r&&i-p[l]>=n)//當i>=n-1時讓l進行l++
            {
                l++;
            }
            if(i>=n-1&&fabs(q[s]-p[l])<=n)//由於q[s]相當於i對應當下的值,作用等同於判斷i>=n-1是否滿足;
            minn=fmin(minn,fabs(num[q[s]]-num[p[l]]));//求得每n個數最大值與最小值的差,進行比較判斷.
        }
        printf("%d\n",minn);
    }
    return 0;
}

思路:

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