5pts WA 求助
查看原帖
5pts WA 求助
98618
Provicy楼主2020/9/21 19:44

RT,第一个数据点下载一下就暴毙了。。感觉是dp的枚举顺序有问题。。

//xtwakioi! xtwddYnoi(双重含义)!
#include <bits/stdc++.h>
#define ri register
#define int long long
//#define E (n+1)
using namespace std; const int N=505, M=10010;
inline int read()
{
    int s=0, w=1; ri char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
    return s*w;
}
int K,E,n,dp[N][M],g[N];
struct Node { int c,f[22]; }q[N][N];
signed main()
{
    K=read(), E=read(), n=read();
    memset(dp,0x3f,sizeof(dp));
    dp[0][0]=0;
    for(ri int i=1;i<=n;i++)
    {
        int pos=read();
        g[pos]++;
        int rt=read();
        int now=0;
        while(rt>=(1ll<<now)) q[pos][g[pos]].f[now]=(1ll<<now), rt-=(1ll<<now), now++;
        if(rt) q[pos][g[pos]].f[now]=rt;
        sort(q[pos][g[pos]].f,q[pos][g[pos]].f+now+1);
        q[pos][g[pos]].c=read();
    }
    for(ri int i=1;i<=E;i++)
    {
        for(ri int j=K;~j;j--)
        {
            dp[i][j]=dp[i-1][j];
            if(!g[i]) dp[i][j]=dp[i-1][j]+j*j;
            else
            {
                for(ri int x=1;x<=g[i];x++)
                {
                    for(ri int k=20;~k;k--)
                    {
                        if(!q[i][x].f[k]) continue;
                        if(j<q[i][x].f[k]) continue;
                        dp[i][j]=min(dp[i][j],dp[i-1][j-q[i][x].f[k]]+(j-q[i][x].f[k])*(j-q[i][x].f[k])+q[i][x].c*q[i][x].f[k]);
                    }
                }
            }
        }
    }
    //for(ri int i=1;i<=E;i++)
    //for(ri int j=0;j<=K;j++) printf("dp[%lld][%lld] = %lld\n",i,j,dp[i][j]);
    printf("%lld\n",dp[E][K]);
    return 0;
}
2020/9/21 19:44
加载中...