大家看一下这两个代码!
#include<bits/stdc++.h>
using namespace std ;
const int maxs = 200010 , TIL = (1 << 28) ;
int H[maxs] , A[maxs] ;
int n , S , L ;
int U[maxs] ;
int Ans ;
bool CMP(int X){
long long sum ;
for(int i = 1 ; i <= n ; i ++ ){
U[i] = H[i] + A[i] * X ;
if(U[i] >= L) sum += U[i] ;
}return sum >= S ;
}int l = 0 , r = TIL ;
int main(){
cin >> n >> S >> L ;
for(int i = 1 ; i <= n ; i ++ ) cin >> H[i] ;
for(int i = 1 ; i <= n ; i ++ ) cin >> A[i] ;
while(l < r){
int mid = (l + r) >> 1 ;
if(CMP(mid) == true) r = mid ;
else l = mid + 1 ;
}cout << l << endl;
return 0 ;
}
#include<bits/stdc++.h>
using namespace std ;
const int maxs = 200010 , TIL = (1 << 28) ;
int H[maxs] , A[maxs] ;
int n , S , L ;
int U[maxs] ;
int Ans ;
bool CMP(int X){
long long sum ;
for(int i = 1 ; i <= n ; i ++ ){
U[i] = H[i] + A[i] * X ;
if(U[i] >= L) sum += U[i] ;
}return sum >= S ;
}int l = 0 , r = TIL ;
int main(){
cin >> n >> S >> L ;
for(int i = 1 ; i <= n ; i ++ ) cin >> H[i] ;
for(int i = 1 ; i <= n ; i ++ ) cin >> A[i] ;
while(l < r){
cout << l << ' ' << r << endl ;
int mid = (l + r) >> 1 ;
if(CMP(mid) == true) r = mid ;
else l = mid + 1 ;
}cout << l << endl;
return 0 ;
}
这两代码都是一模一样的 ,只不过第二个代码多输出了二分时的两端点 , 结果最后输出的答案竟然不同, 不信你去试试!第一个代码只输出0 , 第二个代码却一直都是对的 。