Codeforces Round #610 (Div. 2)C. Petya and Exam

题目来源: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);
    }
}
发布了56 篇原创文章 · 获赞 17 · 访问量 2317

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/103768508