NOJ——1624死胡同(胡搞模拟)

  • [1624] 死胡同

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • 一个死胡同由排成一列的 n 个格子组成,编号从 1 到 n 。
    实验室的“猪猪”一开始在1号格子,开始向前走,每步一格,并且每走 k 步会在当前的格子上打上记号(开始时,1号格子也有记号)。由于这是死胡同,每当“猪猪”走到最左或者最右的格子时,它会改变方向。好奇的“猪猪”在想:如果我一直走,能否把所有格子都打上记号呢?

    聪明的你一定知道答案!

    Hint1:如果 n=6,k=2,位置变化为:1 -> 3 -> 5 -> 5 -> 3 -> 1 -> 3 -> 5 .... 显然,此时不能将所有格子打上标记。(如下图)

  • 输入
  • 多组输入数据(组数<=100)
    每组数据一行,包含两个正整数 n 和 k。
    (1 <= n <= 100000 , 1 <= k <= 100000)
  • 输出
  • 对于每组数据输出一行 YES 或者 NO 代表能否给所有格子打上标记。
  • 样例输入
  • 6 2
    6 3
  • 样例输出
  • NO
    YES
  • 提示
  • 来源
  • 2015苏州大学ACM-ICPC集训队选拔赛(1)

此题在上学期做过,当时比较naive也是想模拟思路是到头了用reverse数组反转过来再走,然后就机智地TLE了。突然想回来做做这题,当然还是模拟,思路是到头了继续走至超出范围,然后将当前pos对称回来,有种折叠的感觉...事实证明方法可行,但是一交TLE,10W的循环量怎么会TLE?然后找半天找到了几组数据:4 99999,类似于这种k很大n很小的情况下。while里面的while会循环巨多次,此时估计数据量上千万甚至更高然后咋办呢,就开一个结构体数组记录这个点向左走和向右走时是否经过这个点。假设一个点向左走次数或向右走的次数大于等于2,那么这个点在对应的方向被经过了至少两次,可以判断这组数据是走不出来的——只有走不出来的数组才会在某个点重复走来走去。否则让它循环完。

最后膜拜一下那个0ms代码长度还只有300+的。估计是数学方法吧,吾等智商不够又懒...强行模拟好了

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
struct info
{
	int a;
	int b;
};
info pos[100010];
int main(void)
{
	int n,k,i,res;
	while (~scanf("%d%d",&n,&k))
	{
		memset(pos,0,sizeof(pos));
		if(k==1||n==1)//特判
		{
			puts("YES");
			continue;
		}
		int moni=0;//模拟循环量
		bool flag=0;
		int chushi=1;/初始位置
		int cheng=1;//向左/右走
		int cnt=0;//走过的路个数(不重复)
		while (moni<=100010)
		{
			chushi+=cheng*k;
			while(chushi>n||chushi<1)
			{
				if(chushi>n)
				{
					cheng=-1;
					chushi=n-(chushi-n);
				}
				if(chushi<1)
				{
					cheng=1;
					chushi=2-chushi;
				}
			}
			if(pos[chushi].a>=2||pos[chushi].b>=2)//重复走过,标记后break
			{
				flag=0;
				break;
			}
			if(cheng==1)//继续正着走
			{
				if(pos[chushi].a==0)
				{
					cnt++;
				}
				pos[chushi].a++;
			}
			else//反着走
			{
				if(pos[chushi].b==0)
				{
					cnt++;
				}
				pos[chushi].b++;
			}
			if(cnt==n)//模拟量到达,break
			{
				flag=1;
				break;
			}
			moni++;
		}
		if(flag)
		{
			puts("YES");
		}
		else
		{
			puts("NO");
		}
	}
	return 0;
}

  

时间: 2024-10-22 12:53:39

NOJ——1624死胡同(胡搞模拟)的相关文章

NBUT 1624 死胡同(可以用搜索,也可以不用)

[1624] 死胡同 时间限制: 1000 ms 内存限制: 65535 K 问题描述 一个死胡同由排成一列的 n 个格子组成,编号从 1 到 n . 实验室的“猪猪”一开始在1号格子,开始向前走,每步一格,并且每走 k 步会在当前的格子上打上记号(开始时,1号格子也有记号).由于这是死胡同,每当“猪猪”走到最左或者最右的格子时,它会改变方向.好奇的“猪猪”在想: 如果我一直走,能否把所有格子都打上记号呢? 聪明的你一定知道答案! Hint1:如果 n=6,k=2,位置变化为:1 -> 3 ->

胡搞主定理

今天看算导,看到主定理这一块各种渐进.多项式大于小于什么的让我拙计,现在分享一下. 所谓主定理,就是用来解递归方程的一种方法,此方法可以用来求解大多数递归方程. 设递归方程为T(n)=aT(n/b)+f(n)  (其中a≥1,b>1) 主定理: (1)如果存在常数ε>0有f(n)=O(n^(logb^a-ε)),则T(n)=Θ(n^(logb^a)): (2)若f(n)=Θ(n^(logb^a)),则T(n)=Θ(n^(logb^a)logn2^n): (3)若对某个常数ε>0有f(n)

Gym 100917L Liesbeth and the String 规律&amp;&amp;胡搞

题目: Description standard input/outputStatements Little Liesbeth likes to play with strings. Initially she got a string of length n, consisting of letters 'a' only. Then Liesbeth performs next operations with the string: If the first letter of the str

Lightoj 1010 - Knights in Chessboard (胡搞)

题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1010 题目描述: 有一个n*m的棋盘,根据象棋中马走日字的规则,问此棋盘最多可以存放多少个马,并且任意两个马之间不会相互攻击. 解题思路: 从题目中给的棋盘可以看出,如果我们只把马放在白格子或者只把马放在黑格子的话都是合法的,但是是不是最优呢? 仔细考虑一下就可以得出: 当min(n, m) == 1的时候,把格子放满马也是没事的, 当min(n, m) == 2的时候,可

Codeforces 394D Physical Education and Buns 胡搞

题目链接:点击打开链接 题意:给定n个数的序列(能够排序) 操作一次能够使得某个数++或--. 问最少操作几次使得序列变成一个等差序列 输出: 第一行输出最少操作的次数 第二行输出等差数列里的最小项 和 公差的绝对值. 思路:枚举公差,公差范围一定是0到 2Max. 先排个序. 我们使得首项不变.形成一个等差数列. 然后让整个数列位移至 操作后的数组的差值 最小值 == 0.这样这个数列的操作次数= 最大的差值/2. done. #include <iostream> #include <

hdu---(5038)Grade(胡搞)

Grade Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 109    Accepted Submission(s): 63 Problem Description Ted is a employee of Always Cook Mushroom (ACM). His boss Matt gives him a pack of m

Codeforces 669D Little Artem and Dance (胡搞 + 脑洞)

题目链接: Codeforces 669D Little Artem and Dance 题目描述: 给一个从1到n的连续序列,有两种操作: 1:序列整体向后移动x个位置, 2:序列中相邻的奇偶位置互换. 问:q次操作后,输出改变后的序列? 解题思路: 刚开始只看了第一组样例,发现相邻的奇偶位一直在一起,于是乎就开始writing code,写完后发现并不是正解!!!!就去推了一下第三个样例,总是这组实例通过,那组实例卡死,,,,,,,最后终于成功的Mengbility.今天突然想起来,其实整体

模拟电路学习入门的建议(综合整理)

转载自:http://bbs.eetop.cn/viewthread.php?tid=170164 ”模拟电路学习入门“ "如何才算学好模电,数电"一帖引来大家的关注.这里把各位DX的意见整理了一下,便于大家参考.真正掌握一门技术不容易,大家从不同的侧面和经验谈谈自己的体会,对从事这行业的工程师会有点启迪. 找些實用線路集錦或電子製作書看看,有感興趣的就找找理論資料,然後動手練練,很快就是門內漢(or女)了! 先看基本书,再动手练习练习 Razav 如果有耐心看大头英文最好,翻译也很不

模拟地与数字地详解

转自:  http://blog.csdn.net/kevinhg/article/details/12080751 二者本质是一直的,就是数字地和模拟地都是地.要明白为什么要分开,先听一个故事:我们公司的商务楼,2楼是搞模拟的,3楼是搞数字的,整幢楼只有一部电梯,平时人少的时候还好办,上2楼上3楼互不影响,但每天上下班的时候就不得了了,人多得很,搞数字的要上3楼,总是被2楼搞模拟的人影响,2楼模拟的人要下楼,总是要等电梯上了3楼再下来,互相影响很是麻烦,商务楼的物业为解决这个问题,提出了2个方