​C. Petya and Exam​

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

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

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

对于这组数据的解释是:

input: 6 17 2 6 0 0 1 0 0 1 7 6 3 7 10 12output: 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;
}

CAD加油!欢迎跟我一起讨论学习算法