思维题,从中间往后面扫。因为没有考虑K特别大的情况WA了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#include <cassert> #include <iostream> #include <vector> using namespace std; long long A[200005]; int () { long long N, K; cin >> N >> K;
for (int i = 1; i <= N;i++) cin >> A[i];
sort(A+1,A+1+N); int mid = (N+1) / 2; long long current = A[mid];
for (int i = mid + 1; i <= N; i++) { long long dis = A[i] - A[mid]; if(K>=(i - mid) * dis) { K -= (i - mid) * dis; current += dis;
A[mid] += dis; } else { current += K / (i-mid); K %= (i-mid); break; } } if(K) current += K/(N-mid+1); cout << current << 'n'; }
|
近期评论