传送门->SaveTheNature
自己写的代码实在过于啰嗦,和大佬学习了他的写法
这道题先对
p
p
p数组排序
然后每次在
n
n
n个数中二分一个
m
i
d
mid
mid,然后
c
h
e
c
k
check
check当前的
m
i
d
mid
mid看是不是符合
a
n
s
≥
k
ans \ge k
ans≥k的条件
#include <bits/stdc++.h>
typedef long long ll;
const int N = 2e5 + 10;
ll gcd(ll a,ll b)
{
return b ? gcd(b,a % b) : a;
}
void solved()
{
int n;
std::cin >> n;
std::vector<ll> p(n);
for(int i = 0;i < n;i++)
{
std::cin >> p[i];
p[i] /= 100;
}
ll x,y,a,b,k;
std::cin >> x >> a >> y >> b >> k;
std::sort(p.begin(),p.end(),std::greater<int>());
if(x < y)
{
std::swap(x,y);std::swap(a,b);
}
ll c = 1ll * a * b / gcd((ll)a,(ll)b);
int l = 0,r = n + 1;
while(l < r)
{
int mid = l + r >> 1;
ll ans = 0;
int cxy = mid / c,cx = mid / a - cxy,cy = mid / b - cxy;
for(int i = 0;i < cxy;i++)ans += p[i] * (x + y);
for(int i = cxy;i < cxy + cx;i++)ans += p[i] * x;
for(int i = cxy + cx;i < cxy + cx + cy;i++)ans += p[i] * y;
if(ans >= k)r = mid;
else l = mid + 1;
}
if(l == n + 1)std::cout << "-1\n";
else std::cout << l <<"\n";
}
int main()
{
std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
int t;
std::cin>>t;
while(t--)solved();
return 0;
}