NOJ——1624死胡同(胡搞模拟)
来源:互联网 发布:美工字体怎么写好看 编辑:程序博客网 时间:2024/04/28 05:53
[1624] 死胡同
一个死胡同由排成一列的 n 个格子组成,编号从 1 到 n 。
实验室的“猪猪”一开始在1号格子,开始向前走,每步一格,并且每走 k 步会在当前的格子上打上记号(开始时,1号格子也有记号)。由于这是死胡同,每当“猪猪”走到最左或者最右的格子时,它会改变方向。好奇的“猪猪”在想:如果我一直走,能否把所有格子都打上记号呢?
实验室的“猪猪”一开始在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)
每组数据一行,包含两个正整数 n 和 k。
(1 <= n <= 100000 , 1 <= k <= 100000)
对于每组数据输出一行 YES 或者 NO 代表能否给所有格子打上标记。
6 26 3
NOYES
无
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 0x3f3f3f3fstruct 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;}
0 0
- NOJ——1624死胡同(胡搞模拟)
- 模拟noj——打扑克
- ZOJ 2523 —— Number of People(数论,胡搞)
- 胡搞
- Ponds(图论胡搞)
- CodeForces 592C (胡搞)
- NBUT 1624 死胡同(可以用搜索,也可以不用)
- 阿里巴巴钻进死胡同? ——五大看点质疑阿里巴巴
- NOJ 题目1645 聊天止于呵呵(模拟)
- NOJ 2111 小明表达式(dfs,模拟)
- NOJ——1649Find Sum(二分查找)
- NOJ——1656搬砖(DP)
- NOJ——1672剪绳子(博弈)
- NOJ[1362]—— 最短路线
- NOJ 1317——Exercise of Sort
- NOJ[1313] ——Anger Begins
- NOJ——[1438] Get Up, Soldier!
- NOJ——[1361] Prime Again
- NOJ——1627Alex’s Game(II)(尺取)
- git分支管理
- NOJ——1645聊天止于呵呵(string流重定向+map,水题)
- 开发自己的cordova插件
- JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)
- NOJ——1624死胡同(胡搞模拟)
- 网络图片加载的封装-(从零开始搭建android框架系列(4))
- NOJ——1568走走走走走啊走(超级入门DP)
- 1000人通讯录的实现(静态实现)
- 趣学 C 语言(八)—— 文件内部位置
- jq对象 dom对象的转换 为啥转换?因为jq和dom对象具有不同的方法可以使用
- POJ——3070Fibonacci(矩阵快速幂)
- factorial using c
- HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)