• C - Bound Found


    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

    InputcopyOutputcopy
    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
    
    5 4 4
    5 2 8
    9 1 1
    15 1 15
    15 1 15
    1. #include<iostream>
    2. #include<algorithm>
    3. #include<map>
    4. #include<cstring>
    5. #include<vector>
    6. #include<cmath>
    7. #include<cstdlib>
    8. using namespace std;
    9. const int N = 1e5 + 10;
    10. const int INF = 0x3f3f3f3f;
    11. int n, k;
    12. vector<pair<int, int>> b;
    13. struct node {
    14. int num; //数值
    15. int id; //位置
    16. int sum; //前缀和
    17. }a[N];
    18. bool cmp(node a, node b)
    19. {
    20. return a.sum < b.sum;
    21. }
    22. int main()
    23. {
    24. while (cin>>n>>k && (n || k))
    25. {
    26. //读入数据
    27. a[0].num = a[0].id = a[0].sum = 0;
    28. for (int i = 1; i <= n; i++)
    29. {
    30. cin >> a[i].num;
    31. a[i].id = i;
    32. a[i].sum = a[i - 1].sum + a[i].num;
    33. }
    34. sort(a, a + n + 1, cmp); //按照前缀和从小到大排序
    35. int t;
    36. while (k--)
    37. {
    38. cin >> t;
    39. int ans = 0, ansl = 0, ansr = 0;
    40. int left = 0, right = 1;
    41. int minsum = INF,temp;
    42. while (left <= n && right <= n)
    43. {
    44. temp = abs(a[right].sum - a[left].sum); //每次计算从l到r的前缀和
    45. if (abs(temp - t) < minsum) //如果temp与t的距离更,则更新最小的距离minsum,左端点和右端点
    46. {
    47. minsum = abs(temp - t);
    48. ans = temp;
    49. ansl = a[left].id < a[right].id ? a[left].id + 1 : a[right].id + 1; //左端点要加一,不然案例一的答案就不是4 4,而是3 4
    50. ansr = a[left].id < a[right].id ? a[right].id : a[left].id;
    51. }
    52. if (temp < t) right++; //如果temp小于t,就往大的找,尽量降低最小距离
    53. else if (temp > t) left++;//道理同上
    54. else break;
    55. if (left == right) right++;
    56. }
    57. cout << ans << " " << ansl << " " << ansr << endl;
    58. }
    59. }
    60. return 0;
    61. }

     

  • 相关阅读:
    【保姆式教程】用PowerDesigner导出数据库表结构为Word/Excel表格
    SSH远程登录网络设备
    Word-首行缩进2字符设置只缩进一个汉字的问题
    PAT 1012 The Best Rank
    基于Java毕业设计养老院管理系统源码+系统+mysql+lw文档+部署软件
    使用json-server来创建mockserver
    将GC编程语言引入WebAssembly的新方法
    Python 潮流周刊#54:ChatTTS 强大的文本生成语音模型
    LeetCode 第60天 | 84. 柱状图中最大的矩形 单调栈完结
    Elasticsearch:为具有许多 and/or 高频术语的 top-k 查询带来加速
  • 原文地址:https://blog.csdn.net/GF0919/article/details/132716405