分值 : 25 难度 : 中等题 思路 : 二分搜索以及数组优化,data[i] 存放 i 以前的所有值加和 坑点 : 用了二分和数组优化 评语 : 二分细节问题还是有,对二分不是得心应手。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
#include <iostream>#include <vector>using namespace std;vector<int> db ;vector<string> ans;int min_ = 99999999 ;int binary_Search(int base , int s , int e ,int target){ if(s >= e ) return s ; int ss =s , ee =e ; while(ss < ee ) { int mid = (ss+ee)/2 ; if(db[mid]-db[base] ==target ) return mid; else if(db[mid] - db[base] < target) ss = mid+1 ; else ee = mid ; } return ss ;}int main(){ int N , K ,t ,sum = 0; cin >> N >> K ; db.resize(N+1); db[0] = 0 ; for(int i = 1 ; i<= N ; i++) { cin >> t ; sum +=t ; db[i] = sum ; } for(int i = 0 ; i< N ; i++) // 1-1 = db[1] - db[0] n-n = db[n] - db[n-1] { int mid = binary_Search(i , i , N ,K); int k = min_ ; if(db[mid] - db[i] -K == min_) { string s = to_string(i+1) +"-"+to_string(mid) ; ans.push_back(s) ; } else if(db[mid]-db[i] >=K && db[mid] -db[i] - K < min_) { ans.clear(); min_= db[mid] - db[i] - K ; string s = to_string(i+1) +"-"+to_string(mid) ; ans.push_back(s) ; } } for(int i = 0 ; i < ans.size() ;i++) cout << ans[i] <<endl ;}