0
点赞
收藏
分享

微信扫一扫

[PAT甲] 1044 Shopping in Mars (25 分)

seuleyang 2022-03-11 阅读 67
算法

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

#include<cstdio>
#include<algorithm>
using namespace std;
int sum[100010]={0};
int n,m;
int binarySearch(int L,int R,int x);//第一个大于x的位置
int main(){
	int value=100000010;//n<=10^5 and Di<=10^3
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){//注:sum[0]=0
		scanf("%d",&sum[i]);
		sum[i]+=sum[i-1];
	}
	for(int i=1;i<=n;i++){
		int j=binarySearch(i,n+1,sum[i-1]+m);
		if(sum[j-1]-sum[i-1]==m){//存在值就为m的解
			value=m;
			break;
		}else if(j<=n&&sum[j]-sum[i-1]<value){//最接近的值
			value=sum[j]-sum[i-1];
		}
	}
	for(int i=1;i<=n;i++){//输出所有满足的解
		int j=binarySearch(i,n+1,sum[i-1]+value);
		if(sum[j-1]-sum[i-1]==value){
			printf("%d-%d\n",i,j-1);//注:是j-1
		}
	}
}
int binarySearch(int L,int R,int x){//[L,R)
	int l=L,r=R,mid;
	while(l<r){
		mid=(l+r)/2;
		if(sum[mid]>x){
			r=mid;
		}else{
			l=mid+1;
		}
	}
	return l;
}

举报

相关推荐

0 条评论