集训题解-Day3
A.xmy跳石头
题目描述
描述
这里有一堆小石子,每个小石子上都印有一个三位数。任意两个石子,当且仅当它们同时满足以下条件时,他们之间可以相互跳跃。
(1)两个三位数只有一位不同。
(2)他们都是质数。
现在xmy想知道从石子a倒石子b所需要最小跳跃次数,不能跳跃的话输出Impossible。
输入
输入包含多组测试样例
每组两个三位数,a和b,保证a、b都是整数
最后以0 0结尾
输出
输出从a倒b的最少跳跃次数,
样例输入1
101 107
0 0
样例输出1
1
解答
一个比较暴力的做法:直接在可以一步跳跃的两个石头上建立边,把石子看成图上的点,跑最短路即可。
C.xmy开车
题目描述
描述
某天xmy与他的朋友开车去兜风,为了炫富,他们2个人开了2辆车,然而不幸得是,他们的车同时没有了油,但此时每辆车想要到加油站还需要S/2升的油量,现在有一个好心人路过,给了他们3个容器:一个为S升(里面包含S升的汽油),一个为N升,一个为M升(这两个都是空的,且3个容器都没有刻度)。其中S=N+M,现在问你,能否通过它们3个之间相互倒的方式,来使得汽油均分(这样xmy和他的朋友就可以一起到加油站啦!)。
如果能的话,输出最少需要倒的次数,不能的话输出”NO”。这对于xmy来说太Naive啦,但是他想考考你~
输入
三个整数 : S , N 和 M是两个杯子的容量(全部不超过100),以”0 0 0”结束。
输出
如果能平分的话请输出最少要倒的次数,否则输出”NO”。
样例输入1
7 4 3 4 1 3 0 0 0
样例输出1
NO
3
解答
这题属于隐式图的遍历。设三个杯子的当前剩余容量分别为a,b,c,则(a,b,c)即可构成一个状态。初始的状态为(S,0,0),对这个隐式图进行BFS,完成之后进行判断即可。注意c的值可以直接算出,因此(a,b)即可确定状态了。
D.xmy打扑克
题目描述
描述
每次xmy在打扑克的时候都习惯将手上的牌分组,两张一样牌的或者三张一样的牌分成一组。这一次xmy碰到了一个大麻烦,他手上所有的N张牌居然都是一样的!
但是轻度强迫症患者xmy仍然想要将手上的牌两张或者三张分一组,现在他想知道有多少种分组方式。
注意:{2,2,3}和{2,3,2}是两种不同的分组方法
输入
输入数据包含一个整数N,表示xmy有N张相同的牌,其中2<=N<=150。
输出
输出一个整数,表示一共有多少种分组方法。
样例输入1
6
样例输出1
2
提示
样例中
N=6,一共2种分组方法{2,2,2} 和{3,3}。
解答
直接dp即可。设d[i]为i张牌时的分组方法,则d[i] = d[i-2] + d[i-3]。初始值d[2] = d[3] = 1;
ll d[200];
int main()
{
int n;
d[2] = d[3] = 1;
for(int i = 4; i <= 150; i++)
d[i] = d[i-2] + d[i-3];
scanf("%d", &n);
printf("%lld\n", d[n]);
return 0;
}
E.搞事的xmy
题目描述
描述
做了两天题的xmy面对满屏幕的GG感到非常糟糕,他并不知道GG是个什么鬼,也并不想配合他的演出。
于是xmy决定搞一波事情。xmy给不知道是个什么鬼的GG出了一道题:
给定一个由n个数组成的序列以及一个整数N,在序列中每两个数之间添加’+’或者’-‘或者将其合并,问有多少种方案使得序列的运算结果等于N。
当然,GG并不想理睬xmy,果断地将这个锅甩给你了。
输入
第一行包括两整数n(2<=n<=9)和N(0<=N<=10^5)。
第二行包括n个整数,第i个数ai(1<=ai<=9)。
输出
一个整数,表示使得等式成立的总方案数。
样例输入1
9 108
1 2 3 4 5 6 7 8 9
样例输出1
15
解答
由于n非常小,直接进行枚举,9个数之间夹杂着8个符号位,枚举量为3^8 = 6561,完全可以接受。
F.xmy的谋略
题目描述
描述
聪明机智的xmy偶尔会玩一玩《文明》这一类休闲的游戏。眼下xmy正遇到了一个难题。在一块大陆上,xmy所控制的士兵正在与敌方交战,作为一个有谋略的选手,他想到了一个妙计。整个大陆是由5×5的方形区域组成的,每一块区域要么是xmy的地盘,要么是敌人的地盘。为了克敌制胜,xmy决定想办法让自己所有的领土都接壤,这样就不会有哪块敌方被敌方所包围。这的确十分困难,所以xmy想知道他至少再占领几块地盘,才能让自己所有的领地都接壤。
PS:接壤指的是两个正方形区域有公共边。
输入
输入一个5×5的矩阵,其中1表示xmy的地盘,0表示他敌人的地盘。
数据保证强大的xmy不会初始一块地盘都没有。
输出
输出一个整数,表示xmy最少需要攻占多少块地盘
样例输入1
11111
00010
00111
01011
01101
样例输出1
1
解答
由于矩阵只有5×5的大小,直接枚举每一块地盘是否要攻占即可。枚举量为2^25,可以接受。
一些代码量较大的题目未打印出代码,代码可以在http://blog.csdn.net/qyl916?viewmode=contents上找到