坦克风云中的华为题

数据结构及算法 | 2014-05-18 18:57:40 | 阅读 1797 次 | 评论(0)
最近接触到一款坦克风云的手游,其中有个军团争霸环节,涉及到军团排名,前三竞争很是激烈。有三个军


团A,B,C,战力分别排名1,2 ,3。每个军团由于级别不同,所容玩家成员个数也不一样。因A,C是盟军


团,且A+C的战力大于2倍B,觉得如果玩家组织好,让A,C军团的玩家进行适当的交换,就可以让第三名超


过第二名B。运用二数组交换数据,分别让二个数组之和尽可能接近思想(华为题好象二数组同长),可以利益最大化,当然操作


有很大难度,需要玩家相当信任且相当组织和服从。这里可以二个方案,1,可以以A,C中值为标准,找最


接近中值的数,2,让第一名不要超过太多,且让C 刚好大于第B,即以A+C-B作为A。为了让题严谨,现假设最接近数可以确保得第二名.


#include <stdio.h>
#include <math.h>
double v[100];
double total(int i,int k,double j)//I代表数组中的第几个,其实是A,C军团的综合数组;;K代表只能选择几个。
{
double l,r,t;
if(i==-1||k==0||j<0) return 0;
l=total(i-1,k,j);r=total(i-1,k-1,j-v[i])+v[i];//L代表不选择该数,R代表选该数。
t=fabs(l-j)<fabs(r-j) ? l:r;


return t;
}
int main()
{
int n,i,k;
double j;
printf("请输入二个军团的总人数(数组的长度)");
scanf("%d",&n);


printf("请输入一个军团的人数(k数组的长度)");
scanf("%d",&k);


printf("请输入二个军团每成员战力的大小,(此数组的每个数大小)\n");


for( i=0;i<n;i++)
scanf("%lf",&v[i]);


printf("请输入要求最接近的数\n");
scanf("%lf",&j);
printf("此军团的所要求的最佳战力大小可以是(数组中最接近所要求的数可以是):%lf\n",total(n,k,j));
return 0;
}

//程序利用三个参数的动态规划,求找最接近值,不过由于本人水平实在有限,没有能力和精力求出找到时此的每个成员标识,当然用循环可以找,但太多层。测试的数据也有限,也不知是否严谨,望有兴趣的朋友讨论,有时间给下找标识的方案。


文章评论,共0条
游客请输入验证码
浏览176863次
最新评论
  • zhouwenyuan:博主可以开发房产APP吗?
  • qunxingw:结合附件,在分表A或B...实验一下宏就理解了
  • qunxingw:这仅是小范围的一种思路,此题是指数级的数据。