[NWRRC2013]Dwarf Tower 玄学题解

暴力碾标算

时间复杂度还是很不对的。

一种玄学做法。总用时4.28s。

根据题意,一个物品可以由两个特定物品得到,设 \(f[i]\) 是获得一个物品的最少钱数,那么我们可以得到 \(f[i]=min(f[i],f[x_i]+f[y_i])\) , 是制作 \(i\) 的特定物品。

画个图:

这不就像一个树形结构嘛!

显然,由此我们发现更新一个点的最少钱数最多经过 \(2n\) 次更新,况且大多数情况是没到 \(2n\) 次就找到了最小值的。所以以此我们可以打个玄学大暴力,直接暴力模拟这个过程。

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){f=ch=='-'?-1:f;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int n,m,f[100005],a[100005],b[100005],c[100005];
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;++i)f[i]=read();
    for(int i=1;i<=m;++i)
        a[i]=read(),b[i]=read(),c[i]=read();
    for(int i=1;i<=min(5000,(int)log2(n)*500);++i)
    //直接设一个上限,不超时就行
        for(int j=1;j<=m;++j)//暴力模拟
            f[a[j]]=min(f[a[j]],f[b[j]]+f[c[j]]);
    printf("%d\n",f[1]);
    return 0;
}

分享一个玄学做法,仅供参考(大佬勿喷)。

posted @ 2022-03-24 11:43  violetctl39  阅读(34)  评论(0编辑  收藏  举报