[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 ...
随机推荐
- Mysql DOC阅读笔记
Mysql DOC阅读笔记 转自我的Github Speed of SELECT Statements 合理利用索引 隔离调试查询中花费高的部分,例如函数调用是在结果集中的行执行还是全表中的行执行 最 ...
- sqlserver批量插入数据问题
下午做一个批量添加的功能,自动添加的那种,总是没有达到理想情况,后来请教师傅,给了这个批量添加的代码,一改果然好了,敬佩之情油然而生哈.分享下~ insert into t_ShopApplicati ...
- js 作为属性的变量
当声明一个javascript全局变量时,实际上是定义了全局对象的一个属性. 当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说这个变量无法通过delete运算符来删除.可能你已经注意到 ...
- 最新县及县以上行政区划代码JSON数据(截止2015年9月30日)含经纬度数据
数据来源(国家统计局):http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/ 对数据进行的特殊处理: 将直辖市中的 “市辖区” 与 “县” 合并到区域 将 “省直辖县级行 ...
- C#——System.Diagnostics.Process.Start的妙用
我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案 ...
- C语言实现的顺序表
顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...
- 单片微机原理P0:80C51结构原理
本来我真的不想让51的东西出现在我的博客上的,因为51这种东西真的太low了,学了最多就所谓的垃圾科创利用一下,但是想一下这门课我也要考试,还是写一点东西顺便放博客上吧. 这一系列主要参考<单片 ...
- js写分页
jsp:< input value ="1" id ="current" type ="hidden"/> <div id ...
- 安装plsql
sqlplus能登录,服务器.网络.tns配置应该都是好的,应该就是plsql本身的问题 问下安装路径在哪? 注意安装路径中不能有括号,不要安装在C:\Program Files (x86)目录下面
- Visual Studio 内置快速生产代码简写集合
工作之余,整理了一下,Visual Studio 里面的快速生产代码缩写集合,这个拿出来分享想一下,希望对您有所帮助. 文件下载地址:VS内置生产代码缩写集合文档.rar 首字母 简写 生成代码 a ...