PAT甲级-二分查找类型-1044 Shopping in Mars解题思路

1044 Shopping in Mars (25 分)

在这里插入图片描述
在这里插入图片描述

思路

lower_bound当查找不出值,会返回一个超出范围的下标

用scanf、printf避免超时

这种有累加属性的,就是自带sort的,读取数据就要累加,然后首位置0方便操作。

二分查找大于等于某个数的值,然后如果等于即输出,没有一个等于即以最小值再一次搜索。

代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
    int n,m;
    cin>>n>>m;
    int num,sum[100005];
    sum[0]=0;
    for(int i = 1;i<=n;i++)
    {
    
    
        scanf("%d",&sum[i]); 
        sum[i]+=sum[i-1];  
    }    

    int flag = 1;
    int min_value = 1000000000;
 
    for(int i =1;i<=n;i++)
    {
    
    
        int j = lower_bound(sum+i,sum+n+1,m+sum[i-1])-sum;
        if(j<=n)
            min_value = min(min_value,sum[j]-sum[i-1]);
        //cout<<i<<" "<<j<<endl;
        //cout<<i<<" "<<n+1<<endl;
        if (sum[j]-sum[i-1] == m)
        {
    
    
            printf("%d-%d\n",i,j);
            flag =0;
        }
    }
    if(flag)
    {
    
    
        for(int i =1;i<=n;i++)
        {
    
    
            int j = lower_bound(sum+i,sum+n+1,min_value+sum[i-1])-sum;
            if (sum[j]-sum[i-1] == min_value)
                printf("%d-%d\n",i,j);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43999137/article/details/114468940