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的主要内容,如果未能解决你的问题,请参考以下文章
PAT 1044 Shopping in Mars[二分][难]