题意: 两个人比赛,给出比赛序列,如果为1,说明这场1赢,为2则2赢,假如谁先赢 t 盘谁就胜这一轮,谁先赢 s 轮则赢得整个比赛。求有多少种 t 和 s 的分配方案并输出t,s。

解法: 因为要知道有哪些t,s,那么我们至少要枚举一个量,然后才能得出所有分配方案,由题意似乎枚举 t 比较方便。由于 n <= 10^5, 那么我们必须在平均logn算法级以下判断此 t 合不合法,即有没有合法的 s 。经过一些预处理,或者二分都可以达到logn的算法。

预处理sum1[i], sum2[i] 分别表示 i 的左边有多少个1和2.

容器K1,K2分别记录第 i 个1和第 i 个2出现的位置。

然后我们每次扫过去,得出每一轮谁先赢,然后判断最后两个人赢的轮数来得出答案,如果最后是X赢,那么X赢得盘数就要大于另外一个,否则此 t 不合法。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
#define N 100007 vector<pair<int,int> > ans;
vector<int> K1,K2;
int sum1[N],sum2[N],a[N]; int main()
{
int n,i,j,t,s;
while(scanf("%d",&n)!=EOF)
{
ans.clear(), K1.clear(), K2.clear();
for(i=;i<=n;i++) cin>>a[i];
sum1[] = sum2[] = ;
int T1 = , T2 = ;
for(i=;i<=n;i++)
{
sum1[i] = T1, sum2[i] = T2; //0~i-1
if(a[i] == ) K1.push_back(i), T1++;
else K2.push_back(i), T2++;
}
for(t=;t<=n;t++) //t
{
int pos = , won1 = , won2 = , last = ;
while(pos <= n)
{
int c1 = sum1[pos], c2 = sum2[pos];
if(c1 + t > T1 && c2 + t > T2) break;
else if(c1 + t <= T1 && c2 + t <= T2)
{
if(K1[c1+t-] < K2[c2+t-]) //1先赢
{
won1++, last = ;
pos = K1[c1+t-];
}
else
{
won2++, last = ;
pos = K2[c2+t-];
}
}
else if(c1 + t <= T1) //2已经不可能赢
{
won1++, last = ;
pos = K1[c1+t-];
}
else if(c2 + t <= T2)
{
won2++, last = ;
pos = K2[c2+t-];
}
pos++;
}
if(pos == n+)
{
if((last==&&won1>won2) || (last==&&won1<won2))
ans.push_back(make_pair(max(won1,won2),t));
}
}
sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
for(i=;i<ans.size();i++)
printf("%d %d\n",ans[i].first,ans[i].second);
}
return ;
}

Codeforces Round #283 Div.2 D Tennis Game --二分的更多相关文章

  1. Codeforces Round #283 (Div. 2) D. Tennis Game(模拟)

    D. Tennis Game time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. 暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns

    题目传送门 /* 题意:删除若干行,使得n行字符串成递增排序 暴力+构造:从前往后枚举列,当之前的顺序已经正确时,之后就不用考虑了,这样删列最小 */ /*********************** ...

  3. 构造+暴力 Codeforces Round #283 (Div. 2) B. Secret Combination

    题目传送门 /* 构造+暴力:按照题目意思,只要10次加1就变回原来的数字,暴力枚举所有数字,string大法好! */ /************************************** ...

  4. codeforces 497b// Tennis Game// Codeforces Round #283(Div. 1)

    题意:网球有一方赢t球算一场,先赢s场的获胜.数列arr(长度为n)记录了每场的胜利者,问可能的t和s. 首先,合法的场景必须: 1两方赢的场数不一样多. 2赢多的一方最后一场必须赢. 3最后一场必须 ...

  5. Codeforces Round #382 (Div. 2)C. Tennis Championship 动态规划

    C. Tennis Championship 题目链接 http://codeforces.com/contest/735/problem/C 题面 Famous Brazil city Rio de ...

  6. Codeforces Round #382 (Div. 2) C. Tennis Championship 斐波那契

    C. Tennis Championship time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  7. Codeforces Round #382 (Div. 2) C. Tennis Championship

    C. Tennis Championship time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  8. Codeforces Round #283 (Div. 2) C. Removing Columns 暴力

    C. Removing Columns time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. Codeforces Round #283 (Div. 2) A ,B ,C 暴力,暴力,暴力

    A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

随机推荐

  1. datagridview的数据存取

    这里主要是复习DataSet等数据或ADO.NET方面的知识.下面是一个简单的数据存储(在DataGridView上增加一行然后并存储到数据库的过程): private void button1_Cl ...

  2. SharePoint 2013 和卷影复制服务(VSS)概述

    对备份供应商而言,卷影复制服务 (VSS) 使用集中式 API 简化了 Microsoft 服务器解决方案的备份.Microsoft SharePoint Foundation 包括一个参考 VSS ...

  3. 关于AutoCAD 2014的securityload…

    昨天一个朋友给我打电话提到他关于AutoCAD 2014中安全加载SECURTY LOAD的一些困惑,我的同事Fenton写了一篇博客,对AutoCAD 2014安全加载的来龙去脉做了深入详细的阐述, ...

  4. umeng track 相关

    NSString * appKey = @"57105bbbe0f55a7938002063"; NSString * deviceName = [[[UIDevice curre ...

  5. Unable to execute dex: Multiple dex files define(错误分析)

    eclipse工程包名与依靠的代码库包名不能冲突,否则运行程序程序会出错 错误提示:

  6. 【读书笔记】iOS网络-理解错误源

    考虑一个字节是如何从设备发往运程服务器以及如何从远程服务器将这个字节接收到设备,这个过程只需要几百毫秒时间,不过确要求网络设备都能正常工作才行.设备网络和网络互联的复杂性导致了分层网络的产生.分层网络 ...

  7. Windows7下安装CentOS

    以CentOS为平台,配以其他软件共同组成工作平台! 第一部分:安装前准备        1. 准备两个fat32格式的分区,一个用于存放centos光盘镜像及相关安装程序,一个用于安装centos( ...

  8. Java中用内存映射处理大文件

    在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如 ...

  9. php鼠标滚动加载

    http://www.thinkphp.cn/extend/772.html 滚动距离js判断 i = 1; //设置当前页数 $(function() { var totalpage = 6; // ...

  10. substring -----截取字符串

    var str = "0123456789"; substring alert(str.substring(0));------------"0123456789&quo ...