F. Magic Will Save the World

纯粹的發表於2024-07-10

原題連結

題解

1.一定是一部分怪物被水屬性咒語打死,另一部分被火屬性咒語打死
2.遍歷所有“部分”,然後看各部分被水屬性咒語打死需要累積多少秒的水咒語
這裡用到了揹包陣列,(1e6·100)也可以?

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[105];
bool dp[1000005]={0};
ll solve()
{
    ll w,f,n;
    cin>>w>>f>>n;

    ll sum=0;
    for(int i=1;i<=n;i++ )
    {
        cin>>a[i];
        sum+=a[i];
    }

    dp[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int k=sum;k>=a[i];k--)
        {
            dp[k]=dp[k-a[i]]||dp[k];
        }
    }

    ll ans=2e15;
    for(ll i=0;i<=sum;i++)
    {
        if(dp[i]) ans=min(ans,max(i/w+(i%w!=0),(sum-i)/f+((sum-i)%f!=0)));
        dp[i]=0;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--) cout<<solve()<<'\n';
    return 0;
}