| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1827 人关注过本帖, 2 人收藏
标题:百度之星题目
只看楼主 加入收藏
swordd
Rank: 1
等 级:新手上路
帖 子:1
专家分:1
注 册:2009-4-11
收藏
得分:1 
你们想得太简单了
比如数据为
3 10
1 3
3 5
2 4
第一个武器的每次攻击为4 7 10 13 16...
第二个武器8 13 18 23...
第三个6 10 14 18 22...
然后攻击多次可以组合:
(1)同种武器的组合4+7=11,4+10=14,7+10=17,8+13=21,8+18=26...
(2)两种武器的组合4+13=17,8+7=15...
(3)三种武器的组合4+13+14=31(表示第1秒用第一个武器、第2秒第二个、第3秒第3个),注意不可以4+8+6,因为同一秒不可能用几种武器...
然后还可以更复杂的组合...
2011-06-12 13:32
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
很快就会考虑到情况是21楼说的那样。
我一开始还以为这就是个同余方程组的事。不过后来发现,即使解出通解,也并不都是合法的情况。比如同一秒不能同时用两种武器这样的。
用组合数学里的容斥原理好像也不太容易排出这种情况。
感觉还有其它数学模型和这个很像,不过还得有时间再玩玩。我现在比较喜欢搞这种理论性强一点的算法题。
这个题的理论性感觉就是挺强的,同余方程要是学的比较过硬可能一会就能导出来。不过我在这方面的实力好像还不是很够,手头暂时也没有相关的书籍。

另外如果理论上没有什么好方法,八成就是用搜索。不过 sunyh1999 也提了,说是不是很可行。我也没细想。
2011-06-12 14:29
finalken
Rank: 2
等 级:论坛游民
威 望:1
帖 子:30
专家分:94
注 册:2007-10-2
收藏
得分:1 
中国剩余定理变化一下
2011-06-12 15:41
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
还会有情况,就是把它先的血打到负数故意让它满血,然后把它干掉

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-06-12 19:56
a373339205
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:30
专家分:134
注 册:2011-6-9
收藏
得分:0 
其实这道题就是算前k个H的最小值
我的想法是用链表来做
用一个链表来存放所求的H值,这个链表的节点数就是所求的第k最小数。链表的H所有初始值为0;
然后用一个指针指向这个链表的尾结点。
当然,这个链表在插入的时候必须要按照排序的方式来插入,这样可以保证这个链表的尾结点的H值是所求的第k个最小数
然后计算Ai+Bi*t的值是否比尾结点的H值比较,如果小,就插入。
再计算Ai+Bi*t的值加上链表第n个结点的H值相加和链表的指针指向尾结点的H值比较,如果小,就插入链表,再把最后一个k+1的结点去掉,指向尾结点的指针指向再次改变为当前链表的尾结点。如果大,就没必要插入。
最主要的思想就是比较H的值了,在这里我用的是类似穷举法,用递归的方式来做
首先要定义一个标志位,表示这个链表有新值插入过,如果有插入过,这个标志为1,没有插入为0。
因为Ai+Bi*t是递增函数,倘若在t时刻的各个武器的Ai+Bi*t的H值都比链表尾结点的H值来的大,那么t时候以后的H值肯定比链表尾结点的H值来的大,也就没有必要继续比较下去,可以退出递归。
struct list* list;//链表的头指针
struct list* end;//链表的为指针
void insert(int H);//插入链表
void a(int t,struct list* list)
{
    if(flag==0) return;
    flag=0;
    for(i=0;i<k;i++)//k表示链表的第k个结点
   {
      for(j=0;j<n;j++)//n表示武器的种类
      if(weapon[n].Ai+Bi*t < end->H)flag=1,insert(list_k->H+weapon[n].Ai+Bi*t);//如果现在武器的Ai+Bi*t比尾结点的H值来的小,那么插入链表,并且标志位为1.
      if(list_k->H+weapon[n].Ai+Bi*t < end->H)flag=1,insert(list_k->H+weapon[n].Ai+Bi*t);//如果链表的第n个结点的H值加上现在武器的Ai+Bi*t比尾结点的H值来的小,那么插入链表,并且标志位为1.
        
   }
    a(t+1,list);
}
大致思想是这样了,大家看看有什么漏洞没有

[ 本帖最后由 a373339205 于 2011-6-13 08:03 编辑 ]
2011-06-12 21:26
半城寞少
Rank: 2
来 自:西安市
等 级:论坛游民
帖 子:27
专家分:25
注 册:2011-6-12
收藏
得分:1 
我是菜鸟,看不懂你们说什么   真痛苦。

虽然不是我的对手,但还是可以成为我的狗
2011-06-12 22:47
hanfei69882
Rank: 2
等 级:论坛游民
帖 子:12
专家分:21
注 册:2011-4-24
收藏
得分:1 
那个应该是也可以不攻击
2011-06-13 12:55
a373339205
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:30
专家分:134
注 册:2011-6-9
收藏
得分:1 
一个武器某时刻不攻击的肯定排在某时刻攻击的后面,因为这个公式是递增的
2011-06-13 18:26
快速回复:百度之星题目
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017307 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved