码迷,mamicode.com
首页 > 其他好文 > 详细

poj2566 尺取法

时间:2016-09-28 23:00:16      阅读:333      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!