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

1044 Shopping in Mars

时间:2020-02-12 13:06:56      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:alt   ios   ima   pointer   +=   opp   条件   names   main   

大致题意就是给定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\n",i+1,j);
        }
        i++;
    }
    return 0;
}

技术图片

 

1044 Shopping in Mars

标签:alt   ios   ima   pointer   +=   opp   条件   names   main   

原文地址:https://www.cnblogs.com/keep23456/p/12298547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!