トピック出典:http://codeforces.com/contest/1282/problem/C
質問の意味:ありNのトピック、数字0と1の数は、単純なまたは困難を表し、パズルのシンプルなタイトルや時間を行うには、B、配列は、限られた時間を表した後、0-Tタイムアップで行うにはどのくらい尋ねA。
あなたは(0 <= T1 <= T)のままにすると、すべての限られた時間をしなければならないことは少ないT1よりも、それ以外の場合は0である。ではT1
質問を行った後、最初の選択肢を作るために簡単な質問、貪欲を取る上でそれを行うには時間がまだある、別のものを選ぶ行く時間はまだあります。
#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);
}
}