2017计蒜之道 第三场 腾讯狼人杀(简单)

来源:互联网 发布:威锋网 mac office 编辑:程序博客网 时间:2024/05/22 12:31

题意:一共有n个人,某些两两的组合可以产生战斗力,一个人可以分别和很多人组合且战斗力叠加,需要花费的资金为k*(n*2-k),k为你选的人的个数,求一个选择方案,使得资金利用率最大(利用率:战斗力/花费的资金)。

思路:简单版本n的最大个数为20,所以可以用二进制枚举,时间复杂度为:2的20次方*n*n;

#include <iostream>#include <cstdio>using namespace std;int arr[21][21];int pd[21];int main(){    int n,m;    cin>>n>>m;    for(int i = 0;i<m;i++)    {        int a,b,p;        cin>>a>>b>>p;        a--,b--;        arr[a][b] = p;    }    for(int i = 0;i<n;i++)    {        cin>>pd[i];    }    int en = (1<<n);    double ans = 0;    for(int st = 0;st<en;st++)    {        int flag = 0;        for(int i = 0;i<n;i++)        {            if(pd[i])            {                if(!(st&(1<<i)))                {                    flag = 1;                    break;                }            }        }        if(flag)            continue;        int k = 0;        double res = 0,sum = 0;        for(int i = 0;i<n;i++)        {            if(st&(1<<i))            {                k++;                for(int j = 0;j<n;j++)                {                    if(j!=i&&(st&(1<<j)))                    {                        sum += arr[i][j];                    }                }            }        }        res = sum/(k*(n*2-k));        ans = max(res,ans);    }    printf("%.4lf",ans);    return 0;}

阅读全文
0 0
原创粉丝点击