码农场 » POJ 2566 Bound Found 题解 《挑战程序设计竞赛》

来源:互联网 发布:程序员必须会c语言吗 编辑:程序博客网 时间:2024/05/22 03:03

本题用的是取尺法,是难得的好题,不过题目数据似乎有些问题,取尺法的复杂度为O(k*n),很明显应该TLE,但是却过了。

而且,本题是想加排序之后才采用的取尺法。

#include <iostream>#include<cstdio>#include<algorithm>#include<math.h>using namespace std;const int N=100005;const int MIN=-100000000;int n,k,a[N],t,from,to;pair<int,int> sum[N];int Sum(int l,int r,int &closet){    if(l>=r)        return MIN;    int ans=sum[r].first-sum[l].first;    if(abs(ans-t)<abs(closet-t))    {        closet=ans;        from=min(sum[l].second,sum[r].second);        to=max(sum[l].second,sum[r].second);    }    return ans;}int main(){    while(scanf("%d%d",&n,&k),n!=0||k!=0)    {        sum[0]=make_pair(0,0);        for(int i=0;i<n;i++)        {              scanf("%d",&a[i]);              sum[i+1]=make_pair(sum[i].first+a[i],i+1);        }        sort(sum,sum+n+1);        while(k--)        {            scanf("%d",&t);            int l=0,r=0,ans=MIN,closet=MIN;            while(1)            {                while(r<n&&ans<t)                {                    ans=Sum(l,++r,closet);                }                if(ans<t)                    break;                ans=Sum(++l,r,closet);            }            printf("%d %d %d\n",closet,from+1,to);        }    }    return 0;}


0 0