AI GOD:1015: 布阵

来源:互联网 发布:sqlserver 评估期已过 编辑:程序博客网 时间:2024/06/15 04:23

http://118.190.162.167/p1015.html

题目描述

小华对兵法非常感兴趣,他研究出一个新的布阵方法。他把所有军队分成n个军团,在这n个军团之间加上m个联系。一个联系是指,对任意的i,j,第i个军团和第j个军团产生联系,当自己和自己发生联系时,效果翻倍,即当自己和自己发生联系时算两个。为了保证军队的团结,每个军团至少建立一个联系。当一个军团建立了联系时,它的战斗力会和联系的数量有关。小华想知道他的军队能产生的最大战斗力是多少。每个军团最多发生k个联系。

数据范围

对于小数据: 1<=n<=m<=10,1<=k<=500,1<=f(i)<=100

对于大数据: 1<=n<=m<=500,1<=k<=500,1<=f(i)<=100000

 

对于所有数据:n-1<=m<=n(n-1)/2

输入描述

第一行有3个数n, m, k。

 

第二行有k个数f(1),f(2),…,f(k),用空格隔开 (1<=f(i)<=100000)。第i个数f(i)表示当一个军团和其他i个军团有联系的时候它的战斗力。

输出描述

只有一行,包含一个数,军队的最大战斗力。

样例输入(精确内容)

2 2 3
3 1 10
        

样例输出(精确内容)

13

解题思路:重点在军团节点的分配上,军团的联系可以不用在意。因为不论联系怎么分配,一个联系总会产生两个节点。故本题可以转化为2n个节点如何分配,能够在保证每个军团至少有一个节点且战斗力最高。其次,根据f(i)的值,用f(i)/i 可以判断出那种节点分配方案最优.根据最优排序,依次尝试为每个军团分配节点且能满足要求。

代码:

#include<iostream>#include<stdio.h>#include<vector>#include<algorithm>using namespace std;bool cmp(vector<float> &a,vector<float> &b) {     return a[2] > b[2]; }int main(){    int num,line,limit,Count;    double Max=0;   // freopen("input.txt","r",stdin);    cin>>num>>line>>limit;    vector<vector<float> >f(limit,vector<float>(3,0));    for(int i=0;i<limit;i++)    {        cin>>f[i][1];        f[i][0]=(double)i+1;        f[i][2]=f[i][1]/f[i][0];    }    sort(f.begin(),f.end(),cmp);   // for(int i=0;i<limit;i++)   //     cout<<f[i][0]<<" "<<f[i][1]<<" "<<f[i][2]<<endl;    Count=line*2;    for(int i=0;i<num;i++)    {        for(int j=0;j<limit;j++)        {            if(f[j][0]<=Count+i+1-num)            {                Max=Max+f[j][1];                Count=Count-f[j][0];                break;            }        }    }    cout<<Max<<endl;    return 0;}


 

原创粉丝点击