选择我自己的算法 2012年CCC加拿大高中生信息学奥赛

在水城,你可能会看到一些鹅。你怎么在计算器上看到鹅呢?方法是输入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。数字是可以重复使用的。数字也不需要全部被用完。但注意你不可以输入多位数。

样例输入 Sample Input

样例输入1

6

3

6

7

8

1

35336

样例输入2

3

2

4

9

2

97

88

样例输出 Sample Output

样例输出1:

Y

样例输出2:

N

Y

数据范围及提示 Data Size & Hint

对于第二个数据,虽然4×4+9×9 = 97,但是由于计算的顺序是从左往右依次进行的,所以输出N。第二行,9+9+4*4就得到了88.

这道题目第一印象其实可以直接搜索
最多6个运算符7个数字,总状态共有2的6次方乘10的7次方
这个数远远大于计算机能共接受的1亿……

我们可以注意到任何一个答案,它一定由前一个数乘或加而得来
那么我们可以倒过来搜,如果目前得数可以被除或被加而得来,那么我们就进行除和减的递归,直到已经递归了W次(或者W加减1?次),看所得数是否可行。

这样我们的状态数大大被消减,饱和状态数大概是50000000*6左右,但是我们由于剪枝的存在根本不可能运行这么多次,估计算法完全可以保证状态数大大低于1000000(应该是……)

#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;

}

时间: 2024-10-10 09:12:58

选择我自己的算法 2012年CCC加拿大高中生信息学奥赛的相关文章

1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛

1267 老鼠的旅行  2012年CCC加拿大高中生信息学奥赛 题目描述 Description You are a mouse that lives in a cage in a large laboratory. 你是一只生活在笼子里的实验室老鼠. The laboratory is composed of one rectangular grid of square cages, with a total of R rows and C columns of cages (1 ≤ R,C

codevs 1277 生活大爆炸 2012年CCC加拿大高中生信息学奥赛

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description Sheldon and Leonard are physicists who are ?xated on the BIG BANG theory. In order to exchange secret insights they have devised a code that encodes UPPERCASE words by shifting their letters

【动态规划】【记忆化搜索】【搜索】CODEVS 1262 不要把球传我 2012年CCC加拿大高中生信息学奥赛

可以暴力递归求解,应该不会TLE,但是我们考虑记忆化优化. 设f(i,j)表示第i个数为j时的方案数. f(i,j)=f(1,j-1)+f(2,j-1)+……+f(i-1,j-1) (4>=j>=1),从f(n,4)开始递归求解就行. 但是考虑到状态最多只有n*4种,所以记忆化掉吧. 初始化:f(i,1)=1 (1<=i<=n-3) 1 #include<cstdio> 2 using namespace std; 3 int n; 4 long long memory

排序系列 之 简单选择排序及其改进算法 —— Java实现

简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数) 1.n=8 个数中,最小数值为1,与第一个数交换:1,3,5,7,2,4,9,6 2.剩下 n-1=7 个数中,最小数值为2,与第二个数交换:1,2,5,7,3,4,9,6 3.剩下 n-2=6 个数中,最小数值为3,与第三个数交换:1,2,3,7,5,4

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动

冒泡排序、选择排序及插入算法

一.冒泡排列 冒泡排序的原理如下,以8个数由大到小排列为例,进行说明,数据存放在数组a[8]中. 假如8个数分别为4.9.10.3.2.14.11.5. a[0]<a[1]即4<9,故交换位置,9.4.10.3.2.14.11.5 a[1]<a[2]即4<10,故交换位置,9.10.4.3.2.14.11.5 a[2]>a[3]即4>3,位置不变,继续比较 a[3]>a[4]即3>2,位置不变,继续比较 a[4<a[5]即2<14,故交换位置,9

【技术宅2】插入选择冒泡快速交换排序算法

//插入排序(一维数组) //插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. function insert_sort($arr){ $count=count($arr); for($i=1;$i<$count;$i++){ $tem=$arr[$i];// 获得当前值 $j=$i-1;// 获得当前值的前一个位置 while($arr[$j]>$tem){// 如果当前值小于前一

【信息学奥赛一本通】Part1.2 基础算法-二分与三分

问题 A: [二分和三分]愤怒的牛 题目描述 农夫约翰建造了一座有n间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在xi的位置,但是约翰的m头牛对小屋很不满意,因此经常互相攻击.约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍.也就是要最大化最近的两头牛之间的距离. 牛们并不喜欢这种布局,而且几头牛放在一个隔间里,它们就要发生争斗.为了不让牛互相伤害.John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是多少呢? 输入 第一行用空格分

1267 老鼠的旅行

1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description You are a mouse that lives in a cage in a large laboratory. 你是一只生活在笼子里的实验室老鼠. The laboratory is composed of one rectangular grid of square cages, with a total