1004—p1m2
1004—p1m2
题目:
p1m2
Accepts: 1003Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 131072/131072 K (Java/Others)
思路:
直接二分答案即可,对于每个答案,计算原来数组需要加1的操作次数以及需要减2的操作次数,通过比较两者的大小来缩小上界或下界。时间复杂度为O(nlog(n))。
代码:
#include <cstdio> #include <algorithm> using namespace std; const int MAXN = 3e5+20; typedef long long ll; ll a[MAXN], n; ll check(ll ans) { ll t1=0, t2=0; ///t1表示需要加1的操作次数,t2表示需要减2的操作次数 for(int i=1; i<=n; i++) { if(ans>a[i]) { t1+=(ans-a[i]); } else if(ans<a[i]) { t2+=(a[i]-ans)/2; } } return t1<=t2; } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i=1; i<=n; i++) scanf("%I64d", &a[i]); ll l = 0, r = 1e9; while(l+1< r) { ll mid = (l + r) >> 1; if(check(mid)) { l = mid; } else { r = mid; } } printf("%I64d\n", l); } return 0; }