题目
http://codeforces.com/contest/1475/problem/D
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 5;
int a[N],b[N],pre1[N],pre2[N];
signed main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
pre1[0]=0,pre2[0]=0;
for(int i=1;i<=n;i++) cin>>a[i],pre1[i]=0,pre2[i]=0;
vector<int> v1,v2;
for(int i=1;i<=n;i++){
cin>>b[i];
if(b[i]==1){
v1.push_back(a[i]);
}
else v2.push_back(a[i]);
}
sort(v1.begin(),v1.end(),greater<int>());
sort(v2.begin(),v2.end(),greater<int>());
if(v1.size()==0){
pre2[0]=v2[0];
for(int i=1;i<v2.size();i++)
pre2[i]=pre2[i-1]+v2[i];
int k=lower_bound(pre2,pre2+v2.size(),m)-pre2;
if(pre2[k]>=m) cout<<(k+1)*2<<endl;
else cout<<"-1"<<endl;
}
else if(v2.size()==0){
pre1[0]=v1[0];
for(int i=1;i<v1.size();i++){
pre1[i]=pre1[i-1]+v1[i];
}
int k=lower_bound(pre1,pre1+v1.size(),m)-pre1;
//cout<<k<<" "<<pre1[k]<<" "<<pre1[2]<<endl;
if(pre1[k]>=m) cout<<k+1<<endl;
else cout<<"-1"<<endl;
}
else{
pre1[0]=v1[0];
//cout<<1<<endl;
for(int i=1;i<v1.size();i++){
pre1[i]=pre1[i-1]+v1[i];
}
pre2[0]=v2[0];
for(int i=1;i<v2.size();i++){
pre2[i]=pre2[i-1]+v2[i];
}
int ans=INF;
for(int i=0;i<v1.size();i++){
if(pre1[i]>=m){
ans=min(ans,i+1);
break;
}
int res=pre1[i];
int k=lower_bound(pre2,pre2+v2.size(),m-pre1[i])-pre2;
// cout<<m-pre1[i]<<endl;
// cout<<res<<" "<<k<<" "<<pre2[k]<<endl;
if(res+pre2[k]>=m){
ans=min(ans,i+1+(k+1)*2);
}
}
int k=lower_bound(pre2,pre2+v2.size(),m)-pre2;
if(pre2[k]>=m) ans=min(ans,(k+1)*2);
if(ans!=INF)cout<<ans<<endl;
else cout<<"-1"<<endl;
}
}
return 0;
}