学大伟业DAY2模拟赛
T1忍者钩爪
题目描述
小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个练习使用钩爪的好地方,决定在这里大显身手。
场景的天花板可以被描述为一个无穷长的数轴,初始小Q挂在原点上。数轴上有N个坐标为整数的圆环供小Q实现钩爪移动。具体操作为:小Q可以将钩爪挂到圆环上,进而荡到关于圆环坐标轴对称的位置。例如小Q在3,圆环在7,则小Q可以通过该圆环移动到11。
现在一个问题难倒了小Q,如何判断自己能否到达某个整点呢?
输入输出格式
输入格式:
第一行两个整数N,M,表示圆环的数量和询问组数
接下来一行共N个整数描述每个圆环的坐标(可重复)
接下来M行每行包含一个整数描述询问
输出格式:
共M行对应M个询问,若小Q能移动到目标点,输出Yes,否则输出No
输入输出样例
说明
对于30%的数据,M≤N≤10,输入坐标绝对值均小于1000。
对于60%的数据,M≤N≤5000。
对于100%的数据,M≤N≤100000,输入坐标绝对值均小于10^18。
题目大意:从原点0,可以通过钩子跳到当前点关于钩子的对称点。
题解:Yes和No写错了..以为没有负半轴....明天再蠢后空翻吃s
30%记忆化搜索...
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; map<int,bool>q; int n,m,p[5202]; void dfs(int x){ if(q[x])return; if(x>1000||x<-1000)return;//没有死循环 q[x]=true; for(int i=1;i<=n;i++){ dfs(2*p[i]-x); } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&p[i]); dfs(0); for(int i=1;i<=m;i++){ int x; scanf("%d",&x); if(q[x])printf("Yes\n"); else printf("No\n"); } return 0; }
正解