标签:那是 ace dash 计算机 panel 注意 描述 个数 int
在水城,你可能会看到一些鹅。你怎么在计算器上看到鹅呢?方法是输入35336,然后把计算器倒过来看,你就能看到gEESE——鹅了。
现在你的计算器的减号不给力了,只有+号和×号可以用,而且也只有部分数字可以工作。现在的任务是对于这个破烂的计算器能否通过简单的数字和固定数目的运算次数得到一个给定的目标值。
注意这个计算器的运算在被按下的时候就立即执行了,而不需要按照运算符优先级的规则。(见样例2)
输入描述
第一行输入一个整数W,表示你能够且必须使用的运算个数。W是是一个介于0到6之间的整数。结下来的一行是一个整数D(1 ≤ D ≤ 10),可以工作的数字键的个数。接下来的D行给出了这D个可以工作的数字键,这些数字键是0-9之间的互不重复的整数。然后给出一个整数V(1 ≤ V ≤ 5),即目标值的个数,接下来的V行每行一个介于0到5,000,000(包含)的整数,代表你需要用过计算器算出来的数值。
输出描述
输出包含V行,对应着V个目标值。每行是Y或者N,代表对应的目标值能在使用这D个数字并且刚好在W次运算的情况下被计算得到或者不能被计算得到。精确的说,一个目标值T能够计算得到的话,那是通过从D个数字钟的某个数字开始,通过加或乘其这些数字刚好W次,然后最后得到数值T。数字是可以重复使用的。数字也不需要全部被用完。但注意你不可以输入多位数。
样例输入1
6
3
6
7
8
1
35336
样例输入2
3
2
4
9
2
97
88
样例输出1:
Y
样例输出2:
N
Y
对于第二个数据,虽然4×4+9×9 = 97,但是由于计算的顺序是从左往右依次进行的,所以输出N。第二行,9+9+4*4就得到了88.
#include <iostream>
using namespace std;
int ANS,W;
int N;
int V;
bool q[100000000];
int temp;
bool can(int ans,int k)
{
if (k==0)
{
if (ans<=9)
{
if (q[ans])
return true;
else
return false;
}
else
return false;
}
for (int i=0;i<=9;i++)
if (q[i])
if (can(ans-i,k-1))
return true;
for (int i=1;i<=9;i++)
if (ans%i==0)
if (q[i])
if (can(ans/i,k-1))
return true;
if (ans==0)
if (can(0,k-1))
return true;
return false;
}
int main()
{
cin>>W;
cin>>N;
for (int i=1;i<=N;i++)
{
cin>>temp;
q[temp] = true;
}
cin>>V;
for (int i=1;i<=V;i++)
{
cin>>ANS;
if (can(ANS,W))
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
return 0;
}
标签:那是 ace dash 计算机 panel 注意 描述 个数 int
原文地址:http://www.cnblogs.com/D-AngeloRussell/p/7240196.html