Codeforcesラウンド#610(DIV 2)C。ペチャと試験

トピック出典: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);
    }
}

 

公開された56元の記事 ウォン称賛17 ビュー2317

おすすめ

転載: blog.csdn.net/weixin_43958964/article/details/103768508