ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XTU OJ 程设训练 1407 Alice and Bob

2022-07-03 15:31:38  阅读:153  来源: 互联网

标签:XTU 整场 OJ 样例 Alice 每局 局数 赢得


题目描述

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,样例,Alice,每局,局数,赢得
来源: https://www.cnblogs.com/JaineCC/p/16439925.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有