PAT甲题题解-1044. Shopping in Mars (25)-水题

n,m
然后给出n个数
让你求所有存在的区间[l,r],使得a[l]~a[r]的和为m
并且按l的大小顺序输出对应区间。
如果不存在和为m的区间段,则输出a[l]~a[r]-m最小的区间段方案。

如果两层for循环l和r的话,会超时,实际上for循环一遍即可。

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;

const int maxn=100000+5;
int n,m;
int diamond[maxn];
struct Ans{
    int i,j;
};

vector<Ans> ans;
int main()
{
    scanf("%d %d\n",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&diamond[i]);
    int minlost=INF;
    Ans tmp;
    int sum=0;
    int start=1;
    for(int i=1;i<=n;i++){
        sum+=diamond[i];
//printf("%d %d %d %d %d\n",start,i,sum,sum-m,minlost);
        if(sum<m)
            continue;
        if(sum-m<=minlost){
            if(sum-m<minlost){
                ans.clear();
                minlost=sum-m;
            }
            tmp.i=start;
            tmp.j=i;
            ans.push_back(tmp);
        }
        if(sum>=m && start<i){
            sum-=diamond[i];
            i--;
            sum-=diamond[start];
            start++;
        }
    }
    for(int i=0;i<ans.size();i++){
        printf("%d-%d\n",ans[i].i,ans[i].j);
    }
    return 0;
}
View Code

 

posted @ 2017-04-07 13:55  辰曦~文若  阅读(354)  评论(0编辑  收藏  举报