博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
乒乓球
阅读量:7085 次
发布时间:2019-06-28

本文共 1241 字,大约阅读时间需要 4 分钟。

问题描述

Gob和Michael常在一起打乒乓球。他们是这样决定比赛的输赢的:比赛由若干大局组成;谁最先赢下s大局谁就获得比赛的胜利;在每一大局中,谁先得t分就获得本大局的胜利。

在一次比赛中,他们只记录了比赛中的每一分是谁得的,但忘记了记录s和t。现在给出比赛的每一分的得分情况,求出所有可能的s和t。Gob保证,得分表是完整的,也就是在比赛恰好在最后一人,得到最后一分后结束。

输入格式(game.in)

第一行一个整数N,代表比赛一共得到了多少分。
第二行N个整数,代表比赛中每一分是谁得到的;1代表Gob,2代表Michael。

输出格式(game.out)

第一行一个整数M,代表共有多少种可能的s,t情况。
接下来M行每行两个整数si, ti,代表一种可能的s,t情况。M种情况按照s从小到大输出;在s相等时按照t从小到大输出。

样例输入1

5
1 2 1 2 1

样例输出1

2
1 3
3 1

样例输入2

5
1 2 2 2 1

样例输出2

0

样例输入3

10
1 1 2 1 1 1 2 2 1 1

样例输出3

3
1 7
3 2
7 1

数据范围与约束

对于50%的数据,N<=1000;
对于100%的数据,1<=N<=100,000。

这是一道好题。

解法
我们可以枚举 t,对于某个t的值,那么s的值也就确定了。
但是需要注意一些细节
1.赢得比赛的人必须是赢得最后一局的人。
2.比赛必须进行到最后,即计分要记到n。
3.两个人赢得局数不能相等。不能平局。
如果直接枚举,时间复杂度大概是个O(n^2)。这样可以得到70分。
N<=100000,可以联想到时间复杂度应该是O(n*logn),是二分吧!
我们可以用两个数组分别记到某个位置Gob和Michael的得分前缀和。
每一局,如果要赢的这一局,就要在上一局得分的基础上在得t分,那就分别用二分在前缀和上查找这个得分,那显然是查找到的位置靠前的那个赢得这一局,那么不断更新得分,变换下标,一直到最后n。

#include
#include
#include
#include
#include
#include
#include
#define MOD 1000000007#define LL long longusing namespace std;int n,maxn;int G[100009],M[100009];struct H{ int s,t;}ans[100009];int cnt; bool cmp(H x,H y){ if(x.s

转载于:https://www.cnblogs.com/dfsac/p/7587881.html

你可能感兴趣的文章
CSS3内容溢出详解
查看>>
SEO人员如何做内容链接?
查看>>
SpringCloud源码:Ribbon负载均衡分析
查看>>
统计自己写的代码量
查看>>
配置防盗链
查看>>
高通推出机器人RB3平台,年内支持5G连接
查看>>
人工智能的应用与发展历程
查看>>
我们距离实现通用人工智能还有多远?
查看>>
使用微信接口自定义分享的网页信息(缩略图,标题,描述)
查看>>
Spring Cloud Gateway 之 Filter
查看>>
C# log4net 配置及使用详解的代码
查看>>
python入门基础学习笔记(一)
查看>>
设为首页VS加入收藏
查看>>
虚拟机相关介绍
查看>>
我的友情链接
查看>>
广播的发送
查看>>
掌握 Cinder 的设计思想 - 每天5分钟玩转 OpenStack(46)
查看>>
DNS原理详解
查看>>
我的友情链接
查看>>
7个重要的Git使用技巧
查看>>