题目来源:http://codeforces.com/contest/1282/problem/C
题意:有n个题目,数字0和1代表简单or难,a,b为做一个简单题或一个难题的时间,之后一个数组表示在限定时间,问在0-T时间内的最多做多少个。
如果在T1离开(0<=T1<=T),所有小于T1限定时间的都得做,不然就是0分。
做一道题后还有时间的话那么就先取做简单题,做一个贪心选择,还有时间再去选择其他的。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct A{
ll ed;
ll t;
}aa[200100];
bool cmp(A t1,A t2)
{
if(t1.t==t2.t)
return t1.ed<t2.ed;
return t1.t<t2.t;
}
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
ll cnt0=0;
ll cnt1=0;
ll n,T,a,b,i,j;
cin>>n>>T>>a>>b;
for(i=1;i<=n;i++)
{
cin>>aa[i].ed;
if(aa[i].ed==0)
cnt0++;
}
cnt1=n-cnt0;
for(i=1;i<=n;i++)
{
cin>>aa[i].t;
}
sort(aa+1,aa+1+n,cmp);
ll sum=0;
ll ans=0;
aa[n+1].t=T+1;
aa[0].t=0;
for(i=0;i<=n;i++)
{
if(i)
{
if(aa[i].ed)
{
cnt1--;
sum+=b;
}
else
{
sum+=a;
cnt0--;
}
}
if(sum>T)
break;
if(aa[i].t==aa[i+1].t)
continue;
if(sum<=aa[i+1].t-1)
{
ll num1=0;
ll num0=min(cnt0,(aa[i+1].t-1-sum)/a);
ll temp=aa[i+1].t-1-sum-num0*a;
if(temp>0)
num1=min(cnt1,temp/b);
ans=max(ans,i+num1+num0);
}
}
printf("%I64d\n",ans);
}
}