关键不要纠结于T是什么。
观察发现,T越大,最后Ho的得分越高。对于任意的T,Ho的得分很容易计算。那么二分查找之就好了。
注意,T = K时,不一定能保证Ho一定赢。若输入全是K,那么Ho就输了。
#include <iostream> using namespace std; int N, K; int *d; //O(n) int ho_score(int T) { int res = 0; int volume = 0; for (int i = 0; i< N; ++i) { volume += T; if (volume <= d[i]) // hi wins { volume = 0; } else { volume -=d[i]; res++; } } return res; } int gtt(int b,int e) { if(e==b+1) return e; if(e==b) return e; int m = (b+e)/2; if (ho_score(m) > N/2) { return gtt(b,m); } else { return gtt(m,e); } } int main() { cin >> N >> K; d = new int[N]; for (int i = 0; i< N;++i) cin >> d[i]; cout << gtt(0,K+1);/// K+1 !~~~~~~ return 0; }