列表

详情


NC200582. 被诅咒的WWT

描述

WWT因为过于可爱被一个邪恶的巫师施了魔咒,将WWT变成了一维的,并将他放到了一根坐标轴的坐标原点上,巫师的魔咒极其强大,WWT需要在坐标轴上移动十二步,且每一步只能移动X,Y,Z的距离。可以选择向左还是向右移动。
也就是说,WWT被巫师变成了一个在坐标轴上移动的棋子。巫师想玩一个游戏,进行q次询问,每次询问为一个点O,问WWT是否能正好在第12步到达该点O。如果能,输出YES,巫师是个奇怪的人,他又施巫术,移动了WWT的位置,使下一次询问的出发点变成了另外的一个点,这一次走12步的距离等于下一次出发点到原点的距离,值得注意的是巫师是个右撇子,每次都将WWT放在坐标轴右边。如果无法到达,则输出NO,且下一次出发点回到坐标轴原点。

输入描述

第一行输入三个数X,Y,Z,0<=X,Y,Z<=1000。
第二行输入一个正整数q次 q<=10000
接下来的q行输入q次一个点O,-10^9<=O<=10^9

输出描述

对于每次询问输出一行YES或NO

示例1

输入:

2 3 5
1
6

输出:

YES

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 22ms, 内存消耗: 592K, 提交时间: 2020-04-11 15:18:32

#include<bits/stdc++.h>
using namespace std;
int main()
{
	set<int>s;
	int x,y,z;
	int q;
	cin>>x>>y>>z;
	s.insert(0);
	set<int>s1;
	for(int i=1; i<=12; i++)
	{
//		cout<<i<<endl;
		for(auto it:s)
		{
			s1.insert(it+x);
			s1.insert(it-x);
			s1.insert(it+y);
			s1.insert(it+z);
			s1.insert(it-y);
			s1.insert(it-z);
		}
		s.clear();
		s=s1;
		s1.clear();
	}
	cin>>q;
	int now=0;
	while(q--)
	{
		int start;
		cin>>start;
		if(s.count(start-now))
		{
			cout<<"YES"<<endl;
			now=abs(start-now);
		}
		else
		{
			now=0;
			cout<<"NO"<<endl;
		}
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 29ms, 内存消耗: 536K, 提交时间: 2020-01-10 13:22:14

#include<bits/stdc++.h>
using namespace std;
int x,y,z,q,s(0),t;
set<int>ss,tt;
void init(int n){
	if(n==12) return;
	tt.clear(); for(int r:ss){
		tt.insert(r-x),tt.insert(r+x),
		tt.insert(r-y),tt.insert(r+y),
		tt.insert(r-z),tt.insert(r+z);
	} ss=tt; init(++n);
}
int main(){
	ss.insert(0); cin>>x>>y>>z>>q; init(0); while(q--){
		cin>>t; if(ss.count(t-s)) cout<<"YES\n",s=abs(t-s);
		else cout<<"NO\n",s=0;
	}
}

上一题