娱乐一下,最近看见的比较有意思的ACM题!

绿色夹克衫 2009-03-06 03:26:56
最近作ACM比较多,碰到一些好玩的题,大家分享一下!
应该都是很早的题了,不知道讨论过没有,不过确实都挺有意思的,有意思的原因就在于解法不同,可能效率上有比较大的差别。

第一题:nim问题

俩孩子轮流抓石子,每次抓的数量只能是2的正整数次幂,比如(1,2,4,8,16....),谁拿到最后1块谁赢!

输入:

N,石子的数量,10进制整数,N <= 10^250

输出:

胜利者的编号(1或2),以及第一次最少抓几块,才能确保胜利

举例

input
8

output
1
2

第二题:

输入N个数,N < 10000
A[0],A[1]......A[N-1] 都满足 0 < A[i] < 15000

让你从A[0] - A[N-1]中随意挑选几个数,使这几个数的和为N的整数倍。

输入:
第一行,N
后面N行,A[0] - A[N-1]

输出:

第一行:你所选的数的个数K
后面K行:你所选的数

举例:

input
5
1
2
3
4
1

output
2
2
3

其中2+3正好=5
...全文
999 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingling1989r 2009-07-27
  • 打赏
  • 举报
回复
留下小脚丫~~
whillcoxdennis 2009-07-02
  • 打赏
  • 举报
回复
mk 有空欣赏一下
xuelong_zl 2009-06-01
  • 打赏
  • 举报
回复
偶只剩崇拜的眼神了.......
FancyMouse 2009-03-13
  • 打赏
  • 举报
回复
pku偶才刷了200多道
风中舞者 2009-03-10
  • 打赏
  • 举报
回复
为什么没有人在pku acm上做的呢?
我现在在pku上做,但是也没有个伴,没什么东西,想做就做,不想做就懒得做了。。。
绿色夹克衫 2009-03-09
  • 打赏
  • 举报
回复
有机会一同解题!要想达到老兄现在的成绩,我还需要追赶一段时间,不过前提是老兄不能继续做了!呵呵!

[Quote=引用 36 楼 wuyi8808 的回复:]
这里也有一些:
http://www.cnblogs.com/skyivben/archive/2008/12/08/1350510.html
[/Quote]
  • 打赏
  • 举报
回复
一下就这么多跟帖了~
发现自己还是太浮躁了,静下心来,向ls各位学习 :)
jlj84237485 2009-03-09
  • 打赏
  • 举报
回复
路过,看一下
kuzalid 2009-03-08
  • 打赏
  • 举报
回复
拿来练练~~多学习学习下~~
wuyi8808 2009-03-08
  • 打赏
  • 举报
回复
Pajack 2009-03-08
  • 打赏
  • 举报
回复
先顶,再学习。。
绿色夹克衫 2009-03-08
  • 打赏
  • 举报
回复
mod 3这个结论得出的过程,本身还是基于dp的,从dp考察出规律之后再用mod 3来判断,
至于判断方法,是将各个数位加和!mod 3和 mod 9都可以用这个方法来判断!

实质上没有什么不明白的地方,而且相信得出mod 3这个结论之后,这里跟贴的所有人都知道可以用数位加和来判断mod 3的结果!
只是比较简单,大家不会在这个问题上多做解释罢了!

[Quote=引用 33 楼 medie2005 的回复:]
恩,其实还是相当于用dp,查看一下前几个数的状态,还是很有规律的,用二进制的位的奇偶来判断,实际上存在一些问题。
以10为例,二进制中包含2个1,奇偶判断的话,应当是2号赢,但实际上是1号赢!
=====================================================================
litaoye 实质上还没搞明白. 其实smileworkers说得很明白了.就是判断模3的情况,这个很好算,就算输入的数有几千位,也只需要将每位上的数相加,再模3就好…
[/Quote]
medie2005 2009-03-08
  • 打赏
  • 举报
回复
恩,其实还是相当于用dp,查看一下前几个数的状态,还是很有规律的,用二进制的位的奇偶来判断,实际上存在一些问题。
以10为例,二进制中包含2个1,奇偶判断的话,应当是2号赢,但实际上是1号赢!
=====================================================================
litaoye 实质上还没搞明白. 其实smileworkers说得很明白了.就是判断模3的情况,这个很好算,就算输入的数有几千位,也只需要将每位上的数相加,再模3就好了.
gfdthfgf 2009-03-08
  • 打赏
  • 举报
回复
既然你知道自己的缺点那还不快改
土豆毛线 2009-03-07
  • 打赏
  • 举报
回复
求n%3,只需把n的各位数字mod 3 加起来就行了,别说250位,就算是25000位也是转眼的事

但是,俺没想明白第一题为什么可以这么解,求解释。
(转二进制是一个明显的解法,mod 3?没想明白)

[Quote=引用 16 楼 owenliangbin 的回复:]
不知道第一题在ACM提交的时候直接就用

if(n%3==0)
{
out1=2;
out2=null;
}
else
{
out1=1;
out2=n%3;
}

等等,10^250,不会是想靠长整数而已吧
[/Quote]
behappy373 2009-03-07
  • 打赏
  • 举报
回复
学习了。。。。顶个
绿色夹克衫 2009-03-07
  • 打赏
  • 举报
回复
恩,其实还是相当于用dp,查看一下前几个数的状态,还是很有规律的,用二进制的位的奇偶来判断,实际上存在一些问题。
以10为例,二进制中包含2个1,奇偶判断的话,应当是2号赢,但实际上是1号赢!

[Quote=引用 27 楼 smileworkers 的回复:]
哦,明白了。

如果n % 3=0,那么,n肯定不是2的幂,A不可能一次拿完
接下来,如果A拿x个,那么B拿2x个或x/2个就可以保证剩下的仍然是3的倍数,直到最后拿完。B必胜

如果n % 3 =1/2,那么A把这个余数拿走,就可以把n % 3=0的局面交给B,A必胜


引用 24 楼 mathe 的回复:
第一题是Nim游戏,分析前面几个数的Nim状态就知道,只需要判断n是否模3为0就可以了。然后就是证明这个结论正确
[/Quote]
绿色夹克衫 2009-03-07
  • 打赏
  • 举报
回复
说实话,我现在都不是很明白解的过程,第一步还好一点,可以用欧拉判定,来判断a是否为n的平方剩余.

后面应该是利用平方剩余的性质以及勒让得符号,根据一个非平方剩余来构造出一个平方数,使x^2 mod n = a

最后再把这个x映射到1-n这个区间内。

其中构造部分有点像变戏法,我写完程序后都不太明白。

[Quote=引用 28 楼 mathe 的回复:]
呵呵,教科书里面的题目,只要求出a模n的次数就好办了。
[/Quote]
绿色夹克衫 2009-03-07
  • 打赏
  • 举报
回复
恩,17楼不错,其实就是抽屉原则的问题!
那天我想出来的时候,自己也高兴了半天,不过我是被逼的,否则总是超时,只能继续想好的办法!
mathe 2009-03-07
  • 打赏
  • 举报
回复
呵呵,教科书里面的题目,只要求出a模n的次数就好办了。
加载更多回复(25)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧