题目链接:http://codeforces.com/problemset/problem/378/B

题目意思:有n个参赛者,他们都需要参加两场半决赛。第一场半决赛的成绩依次是a1, a2, ..., an,分别对应第1~第n个人的成绩。第二场则是b1, b2, ..., bn。其中这两个序列都是以递增方式排列的。需要从中找出有机会跻身于总决赛的人(标记为1)包括成绩排名前k人(对应成绩是a1,b1;a2,b2,...,ak,bk)和处在两场半决赛的总成绩处在n-2k排名的人。至于k是不确定的,只知道范围是:0 ≤ 2k ≤ n

首先可以知道k可以取的最大数是n/2(当然有可能除不尽的,即n是奇数),也就是说两场半决赛有机会晋级总决赛的人数分别至少有前n/2个。我们只需要根据条件来看两场半决赛剩余的n/2个人中还有哪些有机会可以晋级。很容易想到考虑成绩好的那个序列里挑(一),但是这个情况考虑不够周全。test 18(二)的测试数据充分证明了这点。

(一)      3                            (二)  3

         1      3                    2      1

         2  4                  3      4

         6  5                  6      5

接着说说如何挑。先考虑第(一)组数据。从数字较小的那个序列的第k+1个数(前k个数已经确定)来与大的那个序列的第1个数开始比较:即第1列的2和第2列的3比较。由于2比3小,则把第2个人加入有机会晋级的行列(第一场半决赛),人数加一(即cnta++,cnta统计小的那个序列的后k+1符合条件的人数),直到总人数等于n。至于第(二)组数据的处理,我是根据cnta = 0和a[len] > b[len]这两个条件同时满足的情况下来处理的,表示小的那个序列的第k+1个位置的数比大的那个序列的前k+1个数都要大,于是剩下的n-2k个人只能从大的那个序列的人里找。

至于如何标识两个序列谁大谁小,我是通过flag的标记来处理的。

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = 1e5 + ;
int cnta, cnt, flag, n;
int a[maxn], b[maxn]; void solve(int len, int a[], int b[]) // 始终表示a比b小
{
int i, j;
for (i = len, j = ; i <= n; )
{
if (a[i] < b[j])
{
cnta++;
i++;
}
else
j++;
cnt++;
if (cnt == n)
break;
}
if (cnta == && a[len] > b[len]) // 专门是处理第二组数据的情形
{
flag = -flag; // 剩下的n-2k个人只能都从大的那条序列里找
cnta = n - *(len-);
}
} void show1()
{
int i;
for (i = ; i <= n/; i++)
printf("");
for (i = ; i <= cnta; i++)
printf("");
for (i = ; i <= n-cnta-n/; i++)
printf("");
printf("\n");
} void show2()
{
int i;
for (i = ; i <= n; i++)
{
if (i <= n/)
printf("");
else
printf("");
}
printf("\n");
} int main()
{
int i, k;
while (scanf("%d", &n) != EOF)
{
for (i = ; i <= n; i++)
scanf("%d%d", &a[i], &b[i]);
if (n == )
{
if (a[] < b[])
printf("1\n0\n");
else
printf("0\n1\n");
}
else
{
k = n/ + ;
cnt = n/;
cnta = flag = ; // 0: a,1:b
if (a[k-] < b[k-])
solve(k, a, b); // a[k-1]前都为1
else
{
flag = -flag;
solve(k, b, a);
}
if (!flag)
{
show1();
show2();
}
else
{
show2();
show1();
}
}
}
return ;
}

codeforces B. Semifinals 解题报告的更多相关文章

  1. codeforces 31C Schedule 解题报告

    题目链接:http://codeforces.com/problemset/problem/31/C 题目意思:给出 n 个 lessons 你,每个lesson 有对应的 起始和结束时间.问通过删除 ...

  2. codeforces 499B.Lecture 解题报告

    题目链接:http://codeforces.com/problemset/problem/499/B 题目意思:给出两种语言下 m 个单词表(word1, word2)的一一对应,以及 profes ...

  3. codeforces 495C. Treasure 解题报告

    题目链接:http://codeforces.com/problemset/problem/495/C 题目意思:给出一串只有三种字符( ')','(' 和 '#')组成的字符串,每个位置的这个字符 ...

  4. codeforces 490B.Queue 解题报告

    题目链接:http://codeforces.com/problemset/problem/490/B 题目意思:给出每个人 i 站在他前面的人的编号 ai 和后面的人的编号 bi.注意,排在第一个位 ...

  5. CodeForces 166E -Tetrahedron解题报告

    这是本人写的第一次博客,学了半年的基础C语言,初学算法,若有错误还请指正. 题目链接:http://codeforces.com/contest/166/problem/E E. Tetrahedro ...

  6. codeforces 489A.SwapSort 解题报告

    题目链接:http://codeforces.com/problemset/problem/489/A 题目意思:给出一个 n 个无序的序列,问能通过两两交换,需要多少次使得整个序列最终呈现非递减形式 ...

  7. codeforces 485A.Factory 解题报告

    题目链接:http://codeforces.com/problemset/problem/485/A 题目意思:给出 a 和 m,a 表示第一日的details,要求该日结束时要多生产 a mod ...

  8. codeforces 483A. Counterexample 解题报告

    题目链接:http://codeforces.com/problemset/problem/483/A 题目意思:给出一个区间 [l, r],要从中找出a, b, c,需要满足 a, b 互质,b, ...

  9. codeforces 479C Exams 解题报告

    题目链接:http://codeforces.com/problemset/problem/479/C 题目意思:简单来说,就是有个人需要通过 n 门考试,每场考试他可以选择ai, bi 这其中一个时 ...

随机推荐

  1. 15.Android中LinearLayout布局一些小记录

    在App中,我们经常看到布局中会有分割线,直接上代码: <?xml version="1.0" encoding="utf-8"?> <Lin ...

  2. Codevs2157 配对

    题目描述 Description 给出2个序列A={a[1],a[2],…,a[n]},B={b[1],b[2],…,b[n]},从A.B中各选出n个元素进行一一配对(可以不按照原来在序列中的顺序), ...

  3. POJ 1740 A New Stone Game

    A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5453   Accepted: 2989 ...

  4. ISO 基础之 (十二) 文件管理

    一 文件管理 沙盒:让每个APP应用在手机上有一个独立的文件夹,相互之间不能访问. 沙盒目录:NSHomeDirectory() library: 库文件 tmp: 临时文件 1.NSData 也是一 ...

  5. EasyUI queryParams属性 在请求远程数据同时给action方法传参

    http://www.cnblogs.com/iack/p/3530500.html?utm_source=tuicool EasyUI queryParams属性 在请求远程数据同时给action方 ...

  6. Spring IoC、DI入门小程序

    Alt+/智能提示xml配置文件节点及属性:在接口上使用Ctrl+T可以提示其实现类 一.IoC控制反转(将创建对象的权利交给spring)入门小程序 1.引入jar包 2.工程基本结构 3.新建Us ...

  7. JavaScript的apply和call方法及其区别

    参考资料: http://blog.csdn.net/myhahaxiao/article/details/6952321 apply和call能“劫持”其他对象的方法来执行,其形参如下: apply ...

  8. Conjugate prior relationships

    Conjugate prior relationships The following diagram summarizes conjugate prior relationships for a n ...

  9. 锋利的jQuery-7--$.extend()

    $.extend()主要有两个功能: 1.扩展jQuery对象 jQuery.extend({ min: function(a, b) { return a < b ? a : b; }, }) ...

  10. OGNL和Struts2标签

    OGNL和Struts2标签 你使用过的OGNL 页面获取并输出Action属性<s:property value="userName"/> 页面中获取request保 ...