C. Petya and Exam

重要的事情说三遍!认真读题!认真读题!认真读题!

思维要开阔一点,不要被局限住了。

因为 t 很大,所以我们不能遍历 t,但是 n 只有1e5,所以我们可以遍历每道题的截止时间。然后在其多余的时间内尽可能多的做后面还没有做过的简单题,做完了再做难题。

对于这组数据的解释是:

input:
6 17 2 6
0 0 1 0 0 1
7 6 3 7 10 12
output:
1

在前面两分钟内写出两道简单题之后马上离开考场即可,不必做到截止时间最早的那道题。

代码:

// Created by CAD on 2020/1/14.
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
using namespace std;

const int maxn=2e5+5;
pii p[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int m;  cin>>m;
    while(m--)
    {
        int n,t,a,b;
        cin>>n>>t>>a>>b;
        int cnt[2]={0,0},bj[2]={0,0};
        for(int i=1;i<=n;++i)
            cin>>p[i].se,cnt[p[i].se]++;
        for(int i=1;i<=n;++i)
            cin>>p[i].fi;
        sort(p+1,p+n+1);
        int s=0,ans=0;
        for(int i=1;i<=n;++i)
        {
            int ans1=min(cnt[0]-bj[0],(p[i].fi-1-s)/a);
            int ans2=min(cnt[1]-bj[1],(p[i].fi-1-s-ans1*a)/b);
            ans1=max(ans1,0),ans2=max(ans2,0);
            if(p[i].fi>s) ans=max(ans,ans1+ans2+i-1);
            s+=(p[i].se?b:a);
            bj[p[i].se]++;
            if(s>t) break;
            if(i==n) ans=n;
        }
        cout<<ans<<endl;
    }
    return 0;
}