NBUT 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)

题目大意: 题目讲的很清楚,不过要注意 k 是可以大于n 的 因为这个 我RE了几发。这个 有人用了搜索写出来的,,我不是用搜索,所以我这里的代码跟搜索没多大关系。

我的思路就是 设置一个数组,比如是记录朝右行走过的点,那么如果你下次还是朝右走,而且这个点已经走过了,那说明已经进入死循环 可以退出了,这样可以减少很多的时间。

上代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 int vis[100010],star[100010];       //定义一个访问过的数组,还有一个就是 朝右走的访问标记
 5 int main()
 6 {
 7     int n,m;        //点的个数,还有一次走几格
 8     while(~scanf("%d%d",&n,&m))
 9     {
10         if ( n == 1 )       //如果n == 1  那么肯定可以全部访问
11         {
12              printf("YES\n");
13              continue;
14         }
15         memset(vis,0,sizeof(vis));  //初始化
16         memset(star,0,sizeof(star));
17         int res = 1;
18         int l = 1;
19         vis[1] = 1;     //起始点在1,所以直接访问过,
20         int flag = 1;
21         while (1)
22         {
23             if (l < 1)
24             {
25                 flag = 1;
26                 l = 2 - l ;
27             }
28             if (l > n )
29             {
30                 flag = -1;
31                 l = 2 * n - l;      //这个可以自己计算,为何这样,,这边减了之后,依旧可能比1小的,所以下面有一个判断。
32             }
33             if (l < 1)
34             {
35                 flag = 1;
36                 l = 2 - l ;
37             }
38             if (vis[l] != 1 )       //没访问过
39             {
40                 vis[l] = 1;
41                 res ++;
42             }
43             if ( (star[l] == 1 && flag == 1) || (flag == -1 && l == 1) )        //如果一个方向上的点,走了第二次 说明进入死循环 可以退出
44             {
45                 break;
46             }
47             if ( flag == 1)     //记录朝右走过的点
48             {
49                 star[l] = 1;
50             }
51             if ( res == n )
52             {
53                 break;
54             }
55             if (flag == 1 )
56             {
57                 l += m % (2 * n - 2);       // 2*n - 2  这个规律不难发现,我是画一下图,就知道了 就是一个循环,就是下次走到这个点,并且走的方向是相同的
58                 continue;
59             }
60             else if (flag == -1)
61             {
62                 l -= m % (2 * n - 2);
63                 continue;
64             }
65             //printf("%d\n",l);
66         }
67         if (res == n )
68         {
69             printf("YES\n");
70         }
71         else if(res != n)
72         {
73             printf("NO\n");
74         }
75     }
76     return 0;
77 }
时间: 2024-10-18 14:46:59

NBUT 1624 死胡同(可以用搜索,也可以不用)的相关文章

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

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

BZOJ 2656 ZJOI2012 数列(sequence) 高精度+记忆化搜索

题目大意:给定一个数列的通项公式,求数列的某一项 高精度+记忆化搜索没说的 其实不用记忆化搜索的但是既然写完了就写完了吧 顺便学习了一下友元函数之类的东西- - #include <map> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; class Big_Int{ private: int nu

24.通过ngram分词机制实现index-time搜索推荐

一.ngram和index-time搜索推荐原理 1.什么是ngram 假设有一个单词:quick,在5种长度下的ngram情况如下: ngram length=1,q u i c k ngram length=2,qu ui ic ck ngram length=3,qui uic ick ngram length=4,quic uick ngram length=5,quick 什么是edge ngram,就是首字母后进行ngram.比如quick这个单词,拆分如下: q qu qui qu

多线程搜索与排序

前言:多线程搜索数组和排序在实际开发中是一个很常见的场景,我们可能会通过数组保存一些业务数据,通过搜索达到自己想要的数据或者对数据按照一定的业务规则排序,而在技术选择上一般最常见的技术就是for循环遍历和各种排序算法,这种搜索/排序技术很简单,而我们今天将要探讨的是通过多线程搜索和排序,如何利用多线程的优势去高效的完成搜索和排序是本篇博客聚焦的重点 本篇博客目录 一:多线程搜索 二:所线程排序 三:总结 一:多线程搜索 1.1:创建线程池      为了提升多线程的性能,我们把线程放在线程池集中

Spring cloud实战 从零开始一个简单搜索网站(四)

上篇用了2个方法来来做断路由,太蛋疼了  Spring Cloud集成的是javanica hystrix 虽然集成方便了很多,不过 javanica默认好像不支持 动态修改 commandKey , Hystrix是根据commandKey来分配每个熔断器的  网上也有些解决办法 不过感觉还是太蛋疼了  算了 还是直接用Hystrix好了 先把javanica hystrix的引用换成 hystrix core <dependency> <groupId>com.netflix.

深度学习在搜索业务中的探索与实践

本文根据美团高级技术专家翟艺涛在2018 QCon全球软件开发大会上的演讲内容整理而成,内容有修改. 引言 2018年12月31日,美团酒店单日入住间夜突破200万,再次创下行业的新纪录,而酒店搜索在其中起到了非常重要的作用.本文会首先介绍一下酒店搜索的业务特点,作为O2O搜索的一种,酒店搜索和传统的搜索排序相比存在很大的不同.第二部分介绍深度学习在酒店搜索NLP中的应用.第三部分会介绍深度排序模型在酒店搜索的演进路线,因为酒店业务的特点和历史原因,美团酒店搜索的模型演进路线可能跟大部分公司都不

寒假集训——搜索 B - Sudoku

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> using namespace std; char s[10][10]; int panduan(int row,int cew) { for(int i=0;i<4;i++) { if(s[row][i]==s[row][cew]&&i!=cew) return 0; } for

前段页面搜索功能实现

前段页面获取到了后台段数据,搜索功能就不用后台了,直接就把获得段数据中查询.如果要查询其他不是获取当前段数据,那么还需要和后台交互. html代码只有一个select框.这个数据是后台给出的数据 <select class="chosen-select" onchange="query(this.value)"> <option value="0">${_res.get("laoshixingming"

织梦添加搜索功能

dede如何添加搜索功能代码如下 <form action="plus/search.php" name="formsearch"><input type="hidden" name="kwtype" value="0" />        <input type="text" name="q" value="请输入关键词 如: