学大伟业DAY2模拟赛

T1忍者钩爪

题目描述

小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个练习使用钩爪的好地方,决定在这里大显身手。

场景的天花板可以被描述为一个无穷长的数轴,初始小Q挂在原点上。数轴上有N个坐标为整数的圆环供小Q实现钩爪移动。具体操作为:小Q可以将钩爪挂到圆环上,进而荡到关于圆环坐标轴对称的位置。例如小Q在3,圆环在7,则小Q可以通过该圆环移动到11。

现在一个问题难倒了小Q,如何判断自己能否到达某个整点呢?

输入输出格式

输入格式:

 

第一行两个整数N,M,表示圆环的数量和询问组数

接下来一行共N个整数描述每个圆环的坐标(可重复)

接下来M行每行包含一个整数描述询问

 

输出格式:

 

共M行对应M个询问,若小Q能移动到目标点,输出Yes,否则输出No

 

输入输出样例

输入样例#1: 
2 2
1 3
3
4
输出样例#1: 
No
Yes

说明

对于30%的数据,M≤N≤10,输入坐标绝对值均小于1000。

对于60%的数据,M≤N≤5000。

对于100%的数据,M≤N≤100000,输入坐标绝对值均小于10^18。

题目大意:从原点0,可以通过钩子跳到当前点关于钩子的对称点。

题解:Yes和No写错了..以为没有负半轴....明天再蠢后空翻吃s

30%记忆化搜索...

#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
");
        else printf("No
");
    }
    return 0;
}
30

正解

原文地址:https://www.cnblogs.com/zzyh/p/7725518.html