首页 > 其他 > 详细

poj2566 尺取法

时间:2016-09-28 22:57:19      阅读:431      评论:0      收藏:0      [点我收藏+]
题意:
输入 n m  之后输入n个数 
之后m个询问  对于每个询问 输入一个t    输出  三个数 ans l r  表示从l 到 r的所有数的和的绝对值最接近t 且输出这个和ans
 
思路:就是指针的移动。
 
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<limits.h>
using namespace std;

pair<int,int>p[100005];
int n,m,t,num;

void find(int x)
{
    int i=0,j=1,ans=INT_MAX,temp,l,r,v;
    while(j<=n && ans)
    {
        temp=p[j].first-p[i].first;
        if(abs(temp-x)<=ans)
        {
            ans=abs(temp-x);
            v=temp;
            l=p[i].second;
            r=p[j].second;
        }
        if(temp<x) j++;
        if(temp>x) i++;
        if(i==j) j++;
    }
    if(l>r)
    {
        int a=r;
        r=l;
        l=a;
    }
    printf("%d %d %d\n",v,l+1,r);
}

int main()
{
    while(scanf("%d%d",&n,&m)==2 && (m+n))
    {
        int sum=0;
        p[0]=make_pair(0,0);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&num);
            sum+=num;
            p[i]=make_pair(sum,i);
        }
        sort(p,p+n+1);
        while(m--)
        {
            scanf("%d",&t);
            find(t);
        }
    }
    return 0;
}

 

poj2566 尺取法

原文:http://www.cnblogs.com/a-clown/p/5917971.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!