这个神秘二分答案测样例时总是少算一个,然后我干脆输出ans+1竟然有70分(逃)
还是想求教一下这个二分答案有啥问题吗
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct wu
{
int x,y,sm,pm,sv,pv;
};
wu p[105];
signed main()
{
//freopen("gift.in","r",stdin);
// freopen("gift.out","w",stdout);
int n,m,tot=0;
cin >> n >> m;
for (int i = 1;i <= n;i++)
{
cin >> p[i].x >> p[i].y >> p[i].sm >> p[i].pm >> p[i].sv >> p[i].pv;
//p[i].y%=p[i].x;
}
//tot+=minf;
int l=0,r=100005,mid,ans=0;
while (l <= r)
{
int fz=m,flag=1;
mid=(l+r)/2;
for (int i = 1;i <= n;i++)
{
if (p[i].pm*1.0/p[i].sm > p[i].pv*1.0/p[i].sv)
{
fz-=floor((p[i].x*mid-p[i].y)*1.0/p[i].sv)*p[i].pv;
fz-=ceil(((p[i].x*mid-p[i].y)-(floor((p[i].x*mid-p[i].y)*1.0/p[i].sv)*p[i].sv))*1.0/p[i].sm)*p[i].pm;
if (fz < 0)
{
r=mid-1;
flag=0;
break;
}
}
else
{
fz-=ceil((p[i].x*mid-p[i].y)*1.0/p[i].sm)*p[i].pm;
if (fz < 0)
{
r=mid-1;
flag=0;
break;
}
}
}
if (fz < 0)
{
r=mid-1;
flag=0;
}
if (flag)
{
ans=mid;
l=mid+1;
}
}
if(ans == 0)
{
cout << ans;
}
else
{
cout << ans+1;//逆天输出·-·
}
return 0;
}
PS:while里面那一堆东西是判断大小盒子买哪个划算,如果是大的划算就先买到大的即将溢出为止,转买小的