踢馆帝
踢馆帝原创小测试,第四题!

本帖最后由 踢馆帝 于 2012-4-21 22:04 编辑


某一天,大法师被众多怪物包围,如图所示(俯视图),大法师站在点O,黑色圆点表示怪物。
大法师可以释放“奥术屏障”魔法,奥术屏障是一个以大法师为中心的圆,半径为r

被屏障所围住的怪物都会被奥术震击致死

大法师还可以释放“闪烁”魔法,可以瞬间移动到任意位置。
释放奥术屏障需要耗费大法师的魔法值,消耗量为r^2点魔法值,

奥术震击每杀死一个怪物也会消耗大法师10点魔法。

闪烁同样会消耗魔法值,消耗量为闪烁距离h*10
图中有4只怪物被奥术屏障围住,因此大法师在当前位置释放奥术屏障会消耗r^2 + 4*10 点魔法值

考虑问题:
现在有一群怪物在大法师周围,设为点集P,已知他们的坐标和大法师的坐标,大法师剩余魔法值N点,假设大法师在原地释放奥术屏障,写一个小程序,求得大法师最多能杀死多少只怪物。

附加问题:
假设大法师魔法值剩余很多,那么请你找到一个方法,杀死全部怪物,并且消耗魔法值最少。

由于大法师情况危机,要求一次性杀死所有怪物

(提示,闪烁到某点之后,再释放奥术屏障)

本题没有给出点集P,和魔法值N的具体数字,因此并不需要求出精确数字,重点在于程序的算法

在调试的时候,可以用随机函数生成点集P,然后确定一个数字N,试试看会得到什么结果

挨T虫穴
最近没出题么
展开Biu

踢馆........最近没出题么

[查看全文]
轻舟过
所以我感觉我的题目有点问题
展开Biu

踢馆帝 发表于 2012-5-1 00:06

对,所以我感觉我的题目有点问题

呵呵,看看可以怎么改下

[查看全文]
踢馆帝
不算闪烁费用的话就是包裹点集的最小圆
展开Biu

轻舟过 发表于 2012-4-30 23:38

不算闪烁费用的话就是包裹点集的最小圆,我见过这样的问题的。但是加上闪烁花费的话好像就不一样了

总的 ...

对,所以我感觉我的题目有点问题

[查看全文]
轻舟过
我的出题目的是求一个包裹点集的最小圆
展开Biu

踢馆帝 发表于 2012-4-30 23:22

我的出题目的是求一个包裹点集的最小圆,但是可能描述的不够好,没有突出这个 ...

不算闪烁费用的话就是包裹点集的最小圆,我见过这样的问题的。但是加上闪烁花费的话好像就不一样了

总的最小值可能不在原先包裹点集的最小圆时取到了

[查看全文]
踢馆帝
感觉不是求一个平均那么简单
展开Biu

轻舟过 发表于 2012-4-30 22:55

感觉不是求一个平均那么简单,求怎么做

我的出题目的是求一个包裹点集的最小圆,但是可能描述的不够好,没有突出这个

[查看全文]
轻舟过
感觉不是求一个平均那么简单
展开Biu

感觉不是求一个平均那么简单,求怎么做

[查看全文]
小鬼神
那些怪物不会移动么
展开Biu

话说 那些怪物不会移动么- -

[查看全文]
秋声赋
第二问画图版
展开Biu

第二问画图版

private void ArcaneExplosion2(List *本站禁止HTML标签噢* P, Vector2 Location)

{

Vector2 NeedMoveTo = new Vector2();

Vector2 tempsum = Vector2.Zero;

foreach (var point in P)

{

tempsum += point;

}

NeedMoveTo = tempsum / P.Count;

if (NeedMoveTo != Location) MessageBox.Show("先闪现到" + NeedMoveTo.ToString());

double MaxLenth=0;

foreach (var point in P)

{

if ((point - NeedMoveTo).Length() > MaxLenth)

{

MaxLenth = (point - NeedMoveTo).Length();

}

}

MessageBox.Show("需要" + (MaxLenth * MaxLenth + P.Count * 10 + (NeedMoveTo - Location).Length()).ToString() + "点魔法值");

Graphics g = this.CreateGraphics();

Pen pen = new Pen(System.Drawing.Color.Black, 1);

g.DrawLine(pen, new System.Drawing.Point((int)Location.X, (int)Location.Y), new System.Drawing.Point((int)Location.X - 1, (int)Location.Y - 1));

g.DrawLine(pen, new System.Drawing.Point((int)Location.X, (int)Location.Y), new System.Drawing.Point((int)NeedMoveTo.X, (int)NeedMoveTo.Y));

g.DrawEllipse(pen,

(int)(NeedMoveTo.X - MaxLenth),

(int)(NeedMoveTo.Y - MaxLenth),

(int)MaxLenth*2,(int) MaxLenth*2);

foreach (var point in P)

{

g.DrawEllipse(pen,

(int)(point.X-2),

(int)(point.Y - 2),4,4);

}

}

[查看全文]