1044. Shopping in Mars (25)

来源:互联网 发布:chan算法 matlab代码 编辑:程序博客网 时间:2024/06/05 12:00

用二分查找找终点,不然会超时

#include<iostream>#include<vector>#define MAX 100001#define INF 0x3f3f3f#pragma warning(disable:4996)using namespace std;long int sum[MAX];vector<int> rr;int N;long int M;int min_M=INF;//最接近M大于M的数int flag = 0;int s_search(int index,int low, int high)//若存在大于M,输出最接近M大于M的终点,不存在输出最后一位{    if (low == high) return low;    int mid = (low + high) / 2;    if (sum[mid] - sum[index - 1] < M) return s_search(index, mid + 1, high);    if (sum[mid] - sum[index - 1] == M) return mid;    if (sum[mid] - sum[index - 1] > M) return s_search(index, low,mid);//保证若存在大于,最接近M大于M的终点留再范围中}int main(){    cin >> N>>M;    sum[0] = 0;    for (int t = 1;t <= N;t++)    {        int temp;        scanf("%d", &temp);        sum[t] = sum[t - 1] + temp;    }    for (int i = 1;i <= N;i++)    {        int temp = s_search(i, i, N);        if (sum[temp] - sum[i - 1] == M) {            printf("%d-%d\n", i, temp);flag = 1;        }        else if (flag == 0 && sum[temp] - sum[i - 1] > M)//当没有出现等于M的范围        {            if (sum[temp] - sum[i - 1] == min_M)            {                rr.push_back(i);rr.push_back(temp);            }            if (sum[temp] - sum[i - 1] < min_M)            {                min_M = sum[temp] - sum[i - 1];                rr.clear();rr.push_back(i);rr.push_back(temp);            }        }    }    if (flag == 0)    {        for (auto it = rr.begin();it != rr.end();it+=2)            printf("%d-%d\n", *it, *(it+1));    }}
0 0
原创粉丝点击