题目描述

Alice和Bob打球,已知他们打过的每一回合的输赢情况,每个回合获胜的一方可以得一分。 Alice可以随意设定赢得一局比赛所需的分数和赢得整个比赛所需要的局数。 Alice想赢得比赛,请问在满足下列条件下,Alice应该怎么设置这两个参数,保证自己能赢?

  • 所有的回合都必须用来计算比赛的结果,即每一局比赛都会完整的结束,不会存在未完成的对局

  • 谁先拿到赢得一局所需的分数就赢得这一局

  • 谁先达到赢得比赛所需的局数就赢得这场比赛

  • 不会出现某一方已经赢得比赛的一局或者整场比赛后,还继续打球的情况

  • 每局胜利所需要的分数是相同

输入

包含不超过1000组样例,每个样例为一行。 每行输入一个只含字母'W''L'的字符串,长度不超过200,'W''L'分别表示这一回合Alice赢或者输。

输出

每个样例先输出一行,为合法方案的总数。然后按局分,局数的升序,每一行输出一个方案,包括两个整数,即局分和局数。如果Alice无法赢或者没有合法的方案,只需要输出方案数为0即可。

样例输入

LWW
WLWW
LLWW

样例输出

2
1 2
2 1
2
1 3
3 1
0

样例解释

第一个样例:可以每局先得1分者胜,先赢得2局的人获得整场胜利;也可以每局先得2分者胜,先赢得1局的人获得整场胜利。 第二个样例:可以每局先得3分者胜,先赢得1局的人获得整场胜利;也可以每局先得1分者胜,先赢得3局的人获得整场胜利。不能令每局先得2分者胜,先赢得1局的人获得整场胜利,因为那样会留下未完成的对局。 第三个样例:可怜的Alice无论如何也不能赢。

思路:

本题的大体思路就是模拟,给定胜利需要赢的局数j和每局赢的分数i,然后进行比赛模拟(写个check函数),看Alice在给定的i和j之下,能不能获得胜利

当然不能直接暴力取值。。。。

总共的输赢回合数为n(也就是题目中字符串的长度)

假定每局要赢的分数为i,那么i的取值范围是1-n

问题转化为求胜利要赢的局数j的取值范围

在给定的n不变的情况下

1、如果Alice一直得分,则要赢的局数最多(我实力这么强,还要打这么久,肯定是获胜的条件太严格)

2、如果Alice与Bob实力相当,则要赢的局数最少(我俩实力差不多,打得有来有回,指不定某局侥幸了一下就获胜了)

在1的条件下,j的最大值为n/i

在2的条件下,Alice与Bob实力相当的极限条件如下:

Alice赢了j局,Bob赢了j-1局,并且每局中赢的那一方得了i分,输的那一方得了i-1分(真的非常实力相当了)

所以此时j的最小值为j*(i+i-1) + (j-1)*(i-1+i) = n

解得j = (n+2i-1) / (4i-2)

所以j的范围就得出来了:[(n+2i-1) / (4i-2),n/i]

代码

 1 import java.io.IOException;
2 import java.util.LinkedList;
3 import java.util.List;
4 import java.util.Scanner;
5 ​
6 public class Main {
7 public static char str[]; // 存储输赢回合结果
8 public static int n; // 存储输赢回合数
9 ​
10 public static void main(String[] args) throws IOException {
11 Scanner sc = new Scanner(System.in);
12 while (sc.hasNext()) {
13 str = sc.next().toCharArray(); // 变成字符数组操作时间更短
14 n = str.length;
15 int ans = 0; // 记录结果方案数
16 List<int[]> list = new LinkedList<>(); // 记录结果方案
17 for (int i = 1; i <= n; i++) {
18 for (int j = (n + 2 * i - 1) / (4 * i - 2); j <= n / i; j++) {
19 if (check(i, j)) {
20 ans++;
21 list.add(new int[]{i, j});
22 }
23 }
24 }
25 // 输出结果~
26 System.out.println(ans);
27 for (int k = 0; k < ans; k++) {
28 int temp[] = list.get(k);
29 System.out.println(temp[0] + " " + temp[1]);
30 }
31 }
32 ​
33 }
34
35 // 给定i和j,判断是否刚好能赢
36 public static boolean check(int i, int j){
37 int alice = 0, a_now = 0; // Alice赢的局数、现在的分数
38 int bob = 0, b_now = 0; // Bob赢的局数、现在的分数
39 for (int k = 0; k < n; k++) {
40 if (str[k] == 'W') a_now++;
41 else b_now++;
42 // 判断有没有赢
43 if (a_now == i) {
44 alice++; // Alice赢
45 a_now = 0; //新开一局
46 b_now = 0;
47 }
48 if (b_now == i) {
49 bob++;
50 a_now = 0;
51 b_now = 0;
52 }
53 }
54 // 获胜的条件:当前这局已经打完,并且Alic赢的局数比Bob多,并且Alice赢了j局
55 if (a_now == 0 && b_now == 0 && alice > bob && alice == j) return true;
56 else return false;
57 }​
58 }

耶~

 

XTU OJ 程设训练 1407 Alice and Bob的更多相关文章

  1. XTU OJ 1209 Alice and Bob 2014(嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛)

    Problem Description The famous "Alice and Bob" are playing a game again. So now comes the ...

  2. 计蒜客 ACM训练联盟周赛 第一场 Alice和Bob的Nim游戏 矩阵快速幂

    题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个), ...

  3. sdutoj 2608 Alice and Bob

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2608 Alice and Bob Time L ...

  4. ACdream 1112 Alice and Bob(素筛+博弈SG函数)

    Alice and Bob Time Limit:3000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit ...

  5. 【XSY2190】Alice and Bob VI 树形DP 树剖

    题目描述 Alice和Bob正在一棵树上玩游戏.这棵树有\(n\)个结点,编号由\(1\)到\(n\).他们一共玩\(q\)盘游戏. 在第\(i\)局游戏中,Alice从结点\(a_i\)出发,Bob ...

  6. 博弈 HDOJ 4371 Alice and Bob

    题目传送门 题意:Alice和 Bob轮流写数字,假设第 i 次的数字是S[i] ,那么第 i+1 次的数字 S[i+1] = S[i] + d[k] 或 S[i] - d[k],条件是 S[i+1] ...

  7. 数学--数论--Alice and Bob (CodeForces - 346A )推导

    It is so boring in the summer holiday, isn't it? So Alice and Bob have invented a new game to play. ...

  8. 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  9. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  10. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

随机推荐

  1. Java面试——消息队列

    一.消息队列的使用场景 ☞ 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景.[1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信.  引入消息队列后 ...

  2. Windows7系统显存只有4GB

    Windows7安装后,专用视屏内存只有4GB可用,是不是Windows7不支持4G以上显存的显卡呢?之前在网上有人说,虽然系统显示可用只有4G显存,但是游戏内实际可以超过4G.本人没有特地去试验过. ...

  3. 网络----OSI七层

    OSI 订制的是一个用于计算机或通信系统间互联的标准体质(一般称为OSI参考模型或七层模型) OSI 模型把网络通信的工作分为7层分别是: 常用内容:物理层 数据链层 网络层 注解 OSI 7层 1. ...

  4. Unity C# IEnumrator 与 async 有的区别

    前言 IEnumerator 和 async 是在 Unity 和 C# 中处理异步编程的两种不同方法.它们各自有不同的使用场景和优缺点. IEnumerator IEnumerator 是 C# 中 ...

  5. sort和sorted区别----引子:多维列表,如何实现第一个元素升序,第二个元素降序

    一.列表内建方法--sort() 作用:就地对列表排序(直接在原列表上做排序) 语法: list.sort(func=None, key=None, reverse=False) 当reverse=F ...

  6. CANN训练:模型推理时数据预处理方法及归一化参数计算

    摘要:在做基于Ascend CL模型推理时,通常使用的有OpenCV.AIPP.DVPP这三种方式,或者是它们的混合方式,本文比较了这三种方式的特点,并以Resnet50的pytorch模型为例,结合 ...

  7. flask-sqlalchemy入门

    Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展.它致力于简化在 Flask 中 SQLAlchemy 的使用.SQLAlchemy 是目前pytho ...

  8. python入门教程之十一迭代器、生成器和装饰器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  9. [JAVA/Maven/IDEA]解决JAR包冲突

    1 前言 想必这个问题,诸多同仁都遇到过. 很不凑巧,这段时间咱也屡次撞上这问题好几次了. 因此,实在是有必要说说怎么解决好这问题了0.0 2 诊断:包冲突的异常信息特征 [类定义未发现错误] NoC ...

  10. 第一章 static、单例与继承

    目录 面向对象 一.static关键字 1.static修饰成员变量 2.static修饰成员变量内存中执行原理 3.成员方法的执行原理 4.工具类 5.静态关键字注意事项 6.代码块 java静态代 ...