zoukankan      html  css  js  c++  java
  • POJ2566 ZOJ1964 Bound Found【前缀和+排序+尺取法】

    Time Limit: 5000MS   Memory Limit: 65536K
    Total Submissions: 4085   Accepted: 1266   Special Judge

    Description

    Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronautic and Space Administration (that must be going through a defiant phase: "But I want to use feet, not meters!"). Each signal seems to come in two parts: a sequence of n integer values and a non-negative integer t. We'll not go into details, but researchers found out that a signal encodes two integer values. These can be found as the lower and upper bound of a subrange of the sequence whose absolute value of its sum is closest to t. 

    You are given the sequence of n integers and the non-negative target t. You are to find a non-empty range of the sequence (i.e. a continuous subsequence) and output its lower index l and its upper index u. The absolute value of the sum of the values of the sequence from the l-th to the u-th element (inclusive) must be at least as close to t as the absolute value of the sum of any other non-empty range.

    Input

    The input file contains several test cases. Each test case starts with two numbers n and k. Input is terminated by n=k=0. Otherwise, 1<=n<=100000 and there follow n integers with absolute values <=10000 which constitute the sequence. Then follow k queries for this sequence. Each query is a target t with 0<=t<=1000000000.

    Output

    For each query output 3 numbers on a line: some closest absolute sum and the lower and upper indices of some range where this absolute sum is achieved. Possible indices start with 1 and go up to n.

    Sample Input

    5 1
    -10 -5 0 5 10
    3
    10 2
    -9 8 -7 6 -5 4 -3 2 -1 0
    5 11
    15 2
    -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    15 100
    0 0
    

    Sample Output

    5 4 4
    5 2 8
    9 1 1
    15 1 15
    15 1 15
    

    Source



    问题链接POJ2566 ZOJ1964 Bound Found

    题意简述给出一个整数序列,求其子序列之和最接近所给定的t,输出该子序列和及两端序号。

    问题分析

    序列的各个元素有正有负,事情比较麻烦一些。

    需要先计算前缀和。两个前缀和的差即为一个子序列的和。

    把前缀和及其下标进行排序,就可以用尺取法(序列前缀和单调递增才可以使用)来求最接近的子序列和的值及两端的序号。

    程序说明(略)


    AC的C++语言程序如下:

    /* POJ2566 ZOJ1964 Bound Found */
    
    #include <iostream>
    #include <algorithm>
    #include <limits.h>
    #include <stdio.h>
    
    using namespace std;
    
    const int N = 100000;
    pair<int, int> prefixsum[N+1];
    
    void find(int t, int n)
    {
        int delta = INT_MAX;
        int left, right, ans;
        int start=0, end=1, sum;
    
        while(end <= n && delta) {
            sum = prefixsum[end].first - prefixsum[start].first;
            if(abs(sum - t) < delta) {
                delta = abs(sum - t);
    
                ans = sum;
                left = prefixsum[start].second;
                right = prefixsum[end].second;
            }
            if(sum < t)
                end++;
            if(sum > t)
                start++;
            if(start == end)
                end++;
        }
    
        if(left > right) {
            sum = left;
            left = right;
            right = sum;
        }
    
        printf("%d %d %d
    ", ans, left+1, right);
    }
    
    int main()
    {
        int n, k, a, sum, t;
    
        while(scanf("%d%d", &n, &k) != EOF && (n || k)) {
            prefixsum[0] = make_pair(0, 0);
    
            sum = 0;
            for(int i=1; i<=n; i++) {
                scanf("%d", &a);
    
                sum += a;
                prefixsum[i] = make_pair(sum, i);
            }
    
            sort(prefixsum, prefixsum + n + 1);
    
            while(k--) {
                scanf("%d", &t);
                find(t, n);
            }
        }
    
        return 0;
    }




  • 相关阅读:
    openldap
    Java实现 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
    Java实现 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P1567 统计天数
    Java实现 洛谷 P1567 统计天数
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563663.html
Copyright © 2011-2022 走看看