17978 倒不了的塔 注意题目

17978 倒不了的塔

时间限制:1000MS  内存限制:65535K
提交次数:314 通过次数:39 收入:126

题型: 编程题   语言: G++

Description

    Dota是Defense of the Ancients的简称,是一个dhk和yjf都很喜欢玩的游戏。虽然作为一个ACMer大部分时间都在努力地码啊码,但是,这2个大神每当听到dota这个词就会
拉着别人打dota,丧心病狂得简直令人发指!于是作为他们同学的我也遭殃了。。。
    现在科普一下,dota是一开始每人选一个英雄来攻别人塔的游戏,此处省略一万字。。。里面有好多英雄可以选,什么力量型、敏捷型、智力型英雄,这些英雄还分了2个阵
型,天灾军团和近卫军团,每一个英雄都是不同的,好了,现在问题来了。
    近卫军团有n个英雄,天灾军团有m个英雄,一般我们都选近卫军团,所以只能选近卫军团的英雄,但是也可以输入-ap指令,然后我们所有人都可以选近卫军团和天灾军团的
英雄了。现在我、小A、小B、dhk、yjf按顺序选英雄(共5人),理论上某人选了的英雄别人是不能选的,现在我想知道我们选的英雄有多少种可能的情况,但是我又要陪他们打
dota,所以想请14级未来的acmer来算一算。
    另外,由于dhk和yjf是大神,只要他们各自输入mynameisdhk 、 mynameisyjf 别人选了的英雄他们也能选(而且不会冲突),必须连续的才能生效!

输入格式

输入由3行组成,第一行分别是n,m,k,分别代表近卫军团的英雄数,天灾军团的英雄数,是否输入了-ap指令(0代表没有输入,1代表输入了)。
第二行是一串字符s1,代表dhk输入了的字符串,若字符串包含mynameisdhk 则dhk可以选别人选了的英雄。
第三行是一串字符s2,代表yjf输入了的字符串,若字符串包含mynameisyjf 则yjf 可以选别人选了的英雄。
其中0 <= n + m <= 64, 0 <= k <= 1, s1 和 s2 的长度小于100,且只包含小写字母
(sample有2组,只是给你们看的,实际的数据是单case的,所以每组数据只有上述描述的3行)

输出格式

直接输出题目要求的情况数。

输入样例

5 50 0
mynameisdagouxiongnotdhk
niconicomynameisyjf

3 2 1
niconicomynameisyjf
mynameisdagouxiongnotdhk

输出样例

600

120

提示

需要注意的是,yjf选了C英雄,dhk选了D英雄 和 yjf选了 D 英雄,dhk选了C英雄,这是不一样的情况。

来源

jerrywanglaoji

作者

201230720309

2 29 1
asdfmynameisdhkwer
asdfwmynameisyjk

因为这5个人选英雄是有顺序的,所以不能普通的计数,要分成4类。就是看dhk和yjf有没用技能。

1、如果都用了,那么就是前三个全排,后面,dnk和yjf都无视其他人,所以乘上all * all

2、如果只有dnk用了,注意dnk是第四个人选的,考虑上面,如果它选的和前3个人一样,那么yjf就有28个人选,如果不一样,yjf就是有27个人了,ans = 31 * 30 * 29 * 3 * 28 + 31 * 30 * 29 * 28 * 27

3、如果只是yjf用了,没影响,A(all, 4) * all,因为它最后才选。

4、都没选,就直接全排。

不要认为人数小于5就是0,比如有3个人,但是dhk和yjf都用了技能。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
char dnk[] = "mynameisdhk";
char yjf[] = "mynameisyjf";
char str1[1000];
char str2[1000];
LL A(int n, int m) {
    if (n < m) return 0;
    LL ans = 1;
    for (int i = 1; i <= m; ++i) {
        ans *= n - i + 1;
    }
    return ans;
}
void work() {
    int n, m, k;
    cin >> n >> m >> k;
    cin >> str1 + 1 >> str2 + 1;
    bool flag1 = false;
    bool flag2 = false;
    if (strstr(str1 + 1, dnk) != NULL) flag1 = true;
    if (strstr(str2 + 1, yjf) != NULL) flag2 = true;
//    cout << flag1 << " " << flag2 << endl;
//    cout << A(64, 3) << endl;
    int all = n;
    if (k) all += m;
//    if (all < 5) {
//        cout << 0 << endl;
//        return;
//    }
    LL ans = 0;
    if (flag1 && flag2) {
        ans = A(all, 3) * all * (all);
    } else if (flag1 && !flag2) {
        ans = A(all, 4) * (all - 1);
    } else if (!flag1 && flag2){
        ans = A(all, 4) * all;
    } else {
        ans = A(all, 5);
    }
    cout << ans << endl;
}

int main() {
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    work();
    return 0;
}

时间: 2024-11-07 02:05:37

17978 倒不了的塔 注意题目的相关文章

B 倒不了的塔

Time Limit:1000MS  Memory Limit:65535K 题型: 编程题   语言: 无限制 描述 Dota是Defense of the Ancients的简称,是一个dhk和yjf都很喜欢玩的游戏.虽然作为一个ACMer大部分时间都在努力地码啊码,但是,这2个大神每当听到dota这个词就会 拉着别人打dota,丧心病狂得简直令人发指!于是作为他们同学的我也遭殃了... 现在科普一下,dota是一开始每人选一个英雄来攻别人塔的游戏,此处省略一万字...里面有好多英雄可以选,

汉诺塔题目总结

参考了别人的代码的总结 1.四柱汉诺塔问题和n柱汉诺塔问题 题目: #include<cstdio> #include<algorithm> #include<cmath> using namespace std; double f[70]; void init() { f[1] = 1; f[2] = 3; for(int i = 3; i <= 65; i++) { double Max = f[i - 2] * 2 + 3; for(int j = 1; j

codevs3145 汉诺塔问题

难度等级:白银 3145 汉诺塔问题 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他

汉诺塔系列问题

HDU-1207 汉诺塔II 题目链接 https://vjudge.net/problem/HDU-1207 题面 Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘.有预言说,这件事完成时宇宙

【算法题】06-用栈来解决汉诺塔问题

用栈来解决汉诺塔问题 题目 修改汉诺塔问题的游戏规则:限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动和最优移动总步数. 要求: 方法一:递归的方法 方法二:非递归的方法,用栈来模拟汉诺塔的三个塔 思路 方法一:递归的方法 首先,如果只剩最上层的塔需要移动,则有如下处理: 如果希望从左移动到右,打印Move 1 from left to right 如果希望从中移动到左,打印Move 1 from mid to left 如

黑白棋子的移动(分治)

黑白棋子的移动(chessman) [问题描述] 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子.如n=5时,成为: ○●○●○●○●○● 任务:编程打印出移动过程. [输入样例]chessman.in 7 [输出样例]chessma

【转】ACM/ICPC生涯总结暨退役宣言—alpc55

转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写这篇文章了,但是也很不想去写.毕竟是为之奋斗了两年的目标,不是说舍得就舍得的.然而,自己毕竟是到了该退的时候了,与其扭扭捏捏,不如挥一挥衣袖,尚落得一份潇洒.回首这两年来,有很多是需要总结的.在这里不分巨细的记录下来,或许有点像流水账,但是更多的,是一份对过去的难忘. 童年 我的ACM/ICPC的生

分治3--黑白棋子的移动

分治3--黑白棋子的移动 一.心得 二.题目和分析 黑白棋子的移动(chessman) [问题描述] 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子.如n=5时,成为: ○●○●○●○●○● 任务:编程打印出移动过程. [输入样例]c

codeforces 478D D. Red-Green Towers(dp)

题目链接: codeforces 478D 题目大意: 给出r个红砖,g个绿砖,问有多少种方法搭成最高的塔. 题目分析: 定义状态dp[i][j]表示构造i层的塔需要j块绿砖的方案数. 转移方程: dp[i][j]=dp[i?1][j?i]+dp[i?1][j] 分别代表当前这一层放绿砖还是放红砖(当然要先判断当前状态转移是否合法) AC代码: #include <iostream> #include <cstring> #include <cstdio> #inclu