1044 Shopping in Mars

Posted keep23456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1044 Shopping in Mars相关的知识,希望对你有一定的参考价值。

大致题意就是给定N个数,找出满足第i个数到第j个数的和SUM等于M(如果找不到,也可以找SUM-M>0差值最小)的i和j,并输出i-j。

思路:这题可以用二分法做,但是二分法边界值条件太多,容易出错,推荐使用two pointers。这题用的是two pointers同向扫描法,固定左边界,移动右边界直到不满足某种条件后再移动左边界,终止条件是右边界达到数组末端。

第一次使用two pointers找出最小差值MIN

第二次使用two pointers输出差值等于MIN的i和j

#include"iostream"
using namespace std;

int  a[200010],sum[200010] = {0};//sum[0] = 0
int main() {
    int  n,m;
    scanf("%d%d",&n,&m);
    for(int i = 1 ; i <= n; ++i) {
        scanf("%d",&a[i]);
        sum[i]+=sum[i-1]+a[i];
    }
    int i = 0,j = 1,MIN = 0x3fffffff;
    //达到数组右端时结束循环,此时再移动左边界也无法满足条件了
    while(j <= n) {//two pointers同向扫描,找出最小差值 MIN 
        while(j<=n && sum[j] - sum[i] < m)
            j++;
        if(j <=n && MIN >= sum[j]-sum[i]-m) {
            MIN = sum[j]-sum[i]-m;
        }
        i++;
    }
    i = 0,j = 1;
    while(j <= n) {//再次two pointers同向扫描,如果差值MIN==sum[j]-sum[i],则输出两个端点i+1,j
        while(j<=n && sum[j] - sum[i] < m)
            j++;
        if(j <= n && MIN == sum[j]-sum[i]-m) {
            printf("%d-%d
",i+1,j);
        }
        i++;
    }
    return 0;
}

技术图片

 

以上是关于1044 Shopping in Mars的主要内容,如果未能解决你的问题,请参考以下文章

1044. Shopping in Mars (25)

1044. Shopping in Mars (25)

PAT 1044. Shopping in Mars

PAT 1044 Shopping in Mars[二分][难]

PAT (Advanced Level) 1044 Shopping in Mars

PAT甲级——A1044 Shopping in Mars