3 solutions
- 
  0
周期性+二分
注意点①:周期是x+1,并不是x,但是我第一次用x二分出来r-1碰巧过了,但是一开始我没想通。
注意点②:n可能会小于d,所以存在min函数。
#include<iostream> #include<algorithm> #define ll long long const int N = 1e6 + 5; ll t, n, c, d, sum; ll a[N]; using namespace std; bool check(ll x) { ll frequency = d / (x + 1);//周期的次数 ll remainder = d % (x + 1);//多余出来的天数 ll T = 0, Tr = 0; for (ll i = 1; i <= min(x + 1, n); ++i)T += a[i]; for (ll i = 1; i <= min(remainder, n); ++i) Tr += a[i]; return T * frequency + Tr >= c; } int main() { scanf("%lld", &t); while (t--) { scanf("%lld%lld%lld", &n, &c, &d); for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]); sort(a + 1, a + 1 + n, greater<ll>()); if (a[1] * d < c) { printf("Impossible\n"); continue; } sum = 0; for (int i = 1; i <= min(n, d); ++i)sum += a[i]; if (sum >= c) { printf("Infinity\n"); continue; } ll l = 0, r = d + 1, mid; while (l < r) { mid = (l + r + 1) >> 1; if (check(mid)) l = mid; else r = mid - 1; } printf("%lld\n", l); } return 0; } - 
  0
 
- 1
 
Information
- ID
 - 6673
 - Time
 - 1000ms
 - Memory
 - 256MiB
 - Difficulty
 - 7
 - Tags
 - (None)
 - # Submissions
 - 31
 - Accepted
 - 9
 - Uploaded By