原题链接
题解
当我剩下 \(k\) 个金属时,我肯定选 \(a_i \leq k\) 并且 \(a_i-b_i\) 最小的那个
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[1000006],b[1000006],dp[1000006]={0},cost[1000006]={0};
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);memset(cost,0x3f,sizeof cost);ll n,m;cin>>n>>m;for(ll i=1;i<=n;i++) cin>>a[i];for(ll i=1;i<=n;i++) cin>>b[i];for(ll i=1;i<=n;i++){cost[a[i]]=min(cost[a[i]],a[i]-b[i]);}for(ll i=1;i<=1e6;i++){cost[i]=min(cost[i],cost[i-1]);}for(ll i=1;i<=1e6;i++){if(cost[i]<=i) dp[i]=dp[i-cost[i]]+1;else dp[i]=dp[i-1];}ll ans=0;while(m--){ll x;cin>>x;if(x>=1000000){ll tem=x-1000000,jian=tem/cost[1000000]+1LL;ans+=jian;x-=cost[1000000]*jian;}ans+=dp[x];}cout<<ans*2LL;return 0;
}