题解
当我剩下 \(k\) 个金属时,我肯定选 \(a_i \leq k\) 并且 \(a_i-b_i\) 最小的那个
此题还用了分治法,由于金属数量最高可达 \(1e9\) 所以当金属数量大于 \(1e6\) 的时候肯定用 \(cost[1e6]\)
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[1000006],b[1000006],dp[1000006]={0},cost[1000006]={0};//cost代表剩下cost个金属时,烧融一次最少要消耗几个金属
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;
}
标签:jian,Smithing,1000006,ll,1000000,金属,cost,Skill
From: https://www.cnblogs.com/pure4knowledge/p/18287222