题目描述

Cozy Glow偷偷摸摸的造了一个魔法阵,这个魔法阵在吸取小马国的魔力,所以你得赶紧把它毁掉。

这个魔法阵由若干个神器组成,每个神器都有一个法力值,每两个神器之间也都有一个关联值。你要依次把这些神器拿走,但是,每拿走一个神器,你就会受到一定量的反噬,反噬的量为这个神器与其他还在神器的关联值乘以这个神器的法力值,为了减少反噬,tb148需要拿走每个神器,但由于他贪生怕死,他想让他受到的反噬值之和最小,现在tb148想知道,怎样拿走神器,才能让反噬值的和最小。

输入输出格式

输入格式:

第一行,神器的个数

第二行,每一个神器的法力值

接下来,将以邻接矩阵的形式输入神器之间的关联值

输出格式:

最好的拿取方式所产生反噬值的和

解题思路:

题目说拿走每个神器受到反噬值为关联值乘上法器的法力值

换一种思路,其实就是对于每一个关联值,要乘上它所连接的两个法器中的一个的法力值

又因为想要值最小,所以对于每一个关联值乘上它所连接的法器中法力值小的一个,全部加起来就是答案


注意不要把每个关联值累加两次

 if(i>j)
    ans+=(LL)x*min(a[i],a[j]);

见代码:

#include<cstdio>
#include<iostream>
#define LL long long
using namespace std;
int n,a[1005];
long long ans=0;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            int x;
            scanf("%d",&x);
                if(i>j)
                  ans+=(LL)x*min(a[i],a[j]);
        }
    printf("%lld",ans);
    return 0;
}

留下评论