[TopCoder] SRM_594_DIV2.250
好长一段时间没写博客了,实在是想不出有什么好写的。近期也有对自己的职业做了一点思考,还是整理不出个所以然来,很是烦躁 ...
研究TopCoder已经有一小段时间了,都是在做之前的题目,还没有实际参加过比赛。以后应该会开设一个topcoder的分类专门写一些里面的一些题目,就当做笔记来写 ...
比较喜欢这种解题的方式,有一些题目还是很有挑战性的,这次先贴出一题做一下暖身。(SRM 594 DIV 2)
1、这是道250分的题,原题是:
Fox Ciel is now in high school. The seats in her classroom are arranged into an n by m matrix. The rows are numbered from 0 to n-1 (front to back) and the columns from 0 to m-1 (left to right).
At the beginning, Ciel can choose any of the seats. Then, at the end of each week Ciel will shift one row to the back and one column to the right, wrapping around whenever necessary. Formally, if her current seat is in row r and column c, then her seat next week will be the one in row ((r+1) modulo n) and column ((c+1) modulo m).
Fox Ciel now wonders whether she can sit in all the seats in the classroom if she follows the above procedure. As we already mentioned, she can start in any of the seats. Also, she can attend the school for as many weeks as she wants to. Return "Possible" if she can sit in all the seats and "Impossible" otherwise.
请原谅我蹩脚的英语水平,我只能偷偷地打开Google翻译一下,大致理解一下应该是以下的意思:
某个家伙在上高中,教室里有n×m个座位,编号从0开始。
这货一开始可以随便选一个座位,假设为(x, y),一个星期后,他就要换到现在座位的右后方一个位置,即(x+1, y+1),如果此时他正好坐在最边上,那就从对边的地方开始,即如果x+1=n => x=0; 如果y+1=m => y=0; 换成计算公式就是((x+1)%n, (y+1)%m)。
假设这货还有nnnnnnnn个星期要上课(好悲剧的说),那么在给定的n, m下,请问他是否有可能坐完所有座位(真够蛋疼的)。
首先先将题目抽象一下,根据题意,可以知道:
1、根据地球是圆的,绕一圈后会回到原点这个定律(-_-! 哪来的定律?有毛线关系?),这家伙无论一开始选择什么座位,到最后还是会回到这个位置,所以可以忽略"选择第一个座位"的问题。
2、程序结束的标志是,他回到原来的位置时,已经坐完所有座位,or 还没坐完所有座位。
题目另外给出了参数n、m的值范围是:2-10;
测试数据:
n=2, m=3, result = Possible
n=2, m=2, result = Impossible
n=4, m=6, result = Impossible
n=3, m=6, result = Impossible
n=5, m=7, result = Possible
n=10, m=10, result = Impossible
最暴力的做法是,一个大循环,当回到第一个位置时,判断是否已经遍历了所有位置。
用一个list模拟保存已坐过的位置,根据题目给的公式计算:
var count = n * m;
var list = new List<string>(); int x = , y = ;
while (true)
{
var position = string.Format("{0}:{1}", x, y);
if (list.Contains(position))
return list.Count == count ? "Possible" : "Impossible";
else
list.Add(position); x = (x + ) % n;
y = (y + ) % m;
}
一开始看到这个题目和测试数据后,想到的是另一种可能:n、m值之间的关系直接决定了结果。
于是就画了图,逐个逐个做了比较分析,最后得出了结论:只要n、m无公约数,就可以!
for (int i = , maxDivisor = Math.Min(n, m); i <= maxDivisor; ++i)
if (n % i == && m % i == )
return "Impossible";
return "Possible";
暴力方法比较直观,容易理解,时间复杂度为O(nm);第二种方法,时间复杂度为O(min(n, m)),逻辑明显更简单。
如果抛开这道题的限制,第二种方法无疑是比暴力方法快了很多很多很多很多倍,分别测过其他几份较大的数据,结果也是一样的:
[TopCoder] SRM_594_DIV2.250的更多相关文章
- Topcoder SRM656div1 250 ( 期望DP )
Problem Statement Charlie has N pancakes. He wants to serve some of them for breakfast. We will n ...
- Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索
最近连续三次TC爆零了,,,我的心好痛. 不知怎么想的,这题把题意理解成,第一次选择j,第二次选择i后,只能从1~i-1.i+1~j找,其实还可以从j+1~n中找,只要没有被选中过就行... [题意] ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- topcoder srm 628 div2 250 500
做了一道题,对了,但是还是掉分了. 第二道题也做了,但是没有交上,不知道对错. 后来交上以后发现少判断了一个条件,改过之后就对了. 第一道题爆搜的,有点麻烦了,其实几行代码就行. 250贴代码: #i ...
- TopCoder SRM500 Div1 250 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-250.html SRM500 Div1 250 题意 (看题用了半个小时--) 有 n 个人(编号 ...
- 【topcoder SRM 702 DIV 2 250】TestTaking
Problem Statement Recently, Alice had to take a test. The test consisted of a sequence of true/false ...
- Topcoder SRM583 DIV 2 250
#include <string> #include <iostream> using namespace std; class SwappingDigits { public ...
随机推荐
- processon完全装逼指南
一.引言 作为一名IT从业者,不仅要有扎实的知识储备,出色的业务能力,还需要具备一定的软实力.软实力体现在具体事务的处理能力,包括沟通,协作,团队领导,问题的解决方案等,这些能力在关键时刻比硬性的技术 ...
- 【转】JSON简介以及用法代码汇总
什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { &q ...
- discuz注册 内部错误
ucenter整合后,在论坛注册时出现 内部错误,无法显示,这是因为ucenter中,某个appid没写入! 可以把ucenter安装包下的utilities/checkappid.php,复制到uc ...
- apache的MPM机制-prefork
apache是基于模块化设计的. 关于基础的服务,也采用了模块化的设计,但是这个模块是具有排他性的,同一时间只能有一个得到调用. MPM模块(multi processing module) 多处理模 ...
- JS分段上传文件(File)并使用MD5.js加密文件段用来后台校验
HTML <form method="POST" name="form1" action="/mupload/upload/" enc ...
- Windows加密视频播放器使用教程
1. 下载文件 http://pan.baidu.com/s/1c2aESQs 2. 操作流程 温馨提示 播放时,请务必保证播放设备联网(原因:用户名权限验证需要网络,播放后10秒即可关闭网 ...
- cmake 安装 mysql
因为高版本mysql都用cmake安装,另外安装cluster版的mysql也必须通过cmake安装,所以学习cmake安装mysql很有必要. 今天我因为打算搭配一个mysql集群所以,在虚拟机上安 ...
- Highcharts 本地导出图片和PDF asp.net mvc版
啰嗦: 现在大家利用Highcharts开发时,有时候会遇到导出的功能问题,但是highcharts默认是链接自己的服务器上进行处理,但是有时候我们会连不上他的服务器,所以我们要让他在我们的服务器上进 ...
- leetcode其余题目
1.Largest Rectangle in Histogram http://discuss.leetcode.com/questions/259/largest-rectangle-in-hist ...
- iOS之手势滑动返回功能-b
iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...