pat 1044 Shopping in Mars (二分查找)

思路

把鑽石數量累加起來,這樣數組sum[i]就是1到i的值,這樣數組就變成了遞增的,就可以使用二分查找,從1開始循環**sum[mid] - sum[i - 1]**就可以找到最小的i 到 j的值。最後把結果保存起來

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<set>
#include<cmath>
#include<cstring>
#include<map>
using namespace std;
vector<int> sum,result;
int n,m;
void fun(int i,int &j,int &tempsum){
	int left = i,right = n;
	while(left < right){
		int mid = (left + right) / 2;
		if(sum[mid] - sum[i - 1] >= m)//i- 1可以包含從1開始的情況
		right = mid;
		else
		left = mid + 1;
	}
	j = right;
	tempsum = sum[j] - sum[i - 1];
}
int main(){
	scanf("%d%d",&n,&m);
	sum.resize(n + 1);
	for(int i = 1;i <= n;i++){
		scanf("%d",&sum[i]);
		sum[i] += sum[i - 1];
	}
	int minans = sum[n];
	for(int i = 1;i <= n;i++){
		int j,tempsum;
		fun(i,j,tempsum);
		if(tempsum > minans)continue;
		if(tempsum >= m){
			if(tempsum < minans){
				result.clear();
				minans = tempsum;
			}
			result.push_back(i);
			result.push_back(j);
		}
	}
	for(int i = 0;i < result.size();i += 2)
	printf("%d-%d\n",result[i],result[i + 1]);
	return 0; 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章