Porque bi b_ibEuApenas 1 11 e2 22 Dois tipos, considere dividir em1, 2 a1, a2a 1 ,a 2 Dois números montam o correspondenteai a_iumaEu
a 1 a1 a 1 Satoai a_iumaEuEspecificamente bi = 1 b_i = 1bEu=1 , então1 a1Os itens em um 1 tem vantagens óbvias e desvantagens,ai a_iumaEuQuanto maior melhor
Então, a 1, a 2 a1, a2a 1 ,a 2 iluminandoai a_iumaEuClassifique do maior para o menor
Enum a 1 a1uma matriz 1 antes de tomariieu itens
Neste momento, dois pontos podem ser usados para obter rapidamente um índice de índice mínimoi n d e x remove oíndiceanteriori n d e x grandea 2 a2um 2 elemento
Cumpra as condições e, em seguida, atualize a resposta
dp parece não funcionar (talvez possa ???) ...
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5+10;
const int inf = 1e15;
int t,n,m,a[maxn],b[maxn],a1[maxn],a2[maxn],pre[maxn];
bool com(int a,int b){
return a>b; }
signed main()
{
int t; cin >> t;
while( t-- )
{
cin >> n >> m;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
a1[0]=a2[0]=0;
for(int i=1;i<=n;i++)
{
if( b[i]==1 ) a1[++a1[0]] = a[i];
else a2[++a2[0]] = a[i];
}
sort( a1+1,a1+1+a1[0],com );
sort( a2+1,a2+1+a2[0],com );
for(int i=1;i<=a2[0];i++) pre[i] = pre[i-1]+a2[i];
//ö��ѡ��s��
int ans = inf,sum=0;
for(int i=1;i<=a1[0];i++)
{
sum+=a1[i];
if( sum>=m ){
ans=min(i,ans); break; }
int yu = m-sum;
int index = lower_bound( pre+1,pre+1+a2[0],yu )-pre;
if( index==a2[0]+1 ) continue;
ans = min( ans,i+index*2 );
}
int index = lower_bound( pre+1,pre+1+a2[0],m )-pre;
if( index!=a2[0]+1 )
ans = min( ans,index*2 );
if( ans==inf ) cout << -1 << endl;
else cout << ans << endl;
}
}