ACM International Collegiate Programming Contest World Finals 2014

A - Baggage

题目描述:有\(2n\)个字符摆在编号为\(1\)~\(2n\)格子里,奇数位为\(B\),偶数位为\(A\),另外编号为\((-2n+1)\)~\(0\)的格子是空的,现在可以移动两个相邻的字符,移动到两个空的格子里,最终使得全部\(A\)在全部\(B\)的左边,而且字符都是连续的,但不必放回原位,输出最小步数的方案。

solution
显然,最小操作为\(n\)步。
假设\(n=8\),
__BABABABABABABABA

ABBABABABABABAB__A

ABBA__BABABABABBAA

ABBA|__BABABABA|BBAA

如果存在一种方案使得中间字变成下面的模样,即两个空位跑到了最后
ABBA|AAAABBBB__|BBAA

A__AAAAABBBBBBBBAA

AAAAAAAABBBBBBBB__

最后两位也是空位。四步解决八个字符(四个\(A\),四个\(B\)),也就是可以递归求解方案。

但要特殊处理\(n=3, 4, 5, 6, 7\)的方案,因为这几个的操作比较特殊,最优操作并不是上述的操作,这几个特殊的可以暴搜出来。

时间复杂度:\(O(n)\)

B - Buffed Buffet

题目描述:有\(n\)道菜,这\(n\)道菜可以分成两类,第一类是以整数为计量,即一道这样的菜有一个固定的重量\(\omega_i\),若这道菜点了\(m\)道,则第\(j\)道的美味值为\(t_i-j\Delta t\);第二类是以小数为计量,即这道菜可以取任意一个重量\(X\),则这道菜的美味值为\(\int_{0}^{X} (t_i-x\Delta t) dt\)。问在菜的总质量为\(W\)的情况下,美味值最大是多少。

solution
先解决第一类的菜。
这看起来像一个普通的背包,但直接\(O(nW^2)\)会超时。可以考虑将菜按重量分类,重量相同的菜各自算出第\(j\)道菜的美味值,因为这些菜的重量是相同的,所以取(相同重量的菜)算出来的美味值的前\(W\)个即可。这样归类之后,最多有\(n\)种重量不同的菜,所以背包的时间复杂度为\(O(\sum_{w=1}^{W} wlnn)=O(\frac{1}{2}W^2lnn)\)
然后解决第二类菜。
枚举第一类菜的总重量\(wf\),剩下的重量由第二类的菜来承担。
因为是重量是连续的,考虑用拉格朗日乘数法。设每种菜的重量为\(x_i\),
约束函数
\[g(x_i)=\sum x_i-(W-wf)=0\]
目标函数为
\[f(x_i)=\sum \frac{1}{2}(2t_i-x_i\Delta t)x_i\]
设函数
\[F(x_i)=f(x_i)-\lambda g(x_i)\]
求解得
\[x_i=\frac{t_i-\lambda }{\Delta t}\]
但因为\(x_i \geq 0\),所以选择用二分的方法来求解\(\lambda\),在这里\(\lambda\)有一个特殊的几何意义:每道菜只取美味函数(美味值的被积函数)大于等于\(\lambda\)的部分,若某道菜的\(t_i<\lambda\),则\(x_i=0\)。\(\lambda\)越小,\(g(x_i)\)越能满足。
但有一类特殊的菜需要注意,就是\(\Delta t=0\)的菜,这些菜的美味函数是一个常数函数,这些菜不能用上面的方法来求解(因为\(\Delta t\)在\(x_i\)的分母)。显然,这类菜只需考虑\(t_i\)最大值(\(con\))即可,当\(\lambda > con\)时,就不必选这道菜了,否则\(\lambda < con\)的部分可以用这道菜来补充,所以可以令\(\lambda =con\),算出\(\sum x_i, (W-wf)-\sum x_i\)的部分由\(con\)来补充,更新答案。

如图\(cut\)表示\(con>\lambda\)的情况,此时菜只选到\(cut\)就好,剩余的部分可由\(con\)补充,这样美味值就能增加黄色部分。

时间复杂度:\(O(W^2lnn+Wnlog(2*10^{16})),2*10^{16}=2*10^8*10^8\),前一个\(2*10^8\)表示\(\lambda\)的范围,后一个\(10^8\)表示精度范围。

C - Crane Balancing

题目描述:给出一个在二维平面上的多边形,在平面上\(1 \times 1\)的正方形的重量为\(1\),现在在多边形上指定一个顶点,在这个顶点上放一定质量的物体(无体积),满足多边形不向两边倒,问物体质量的范围,或无论质量是多少都会倒(unstable)

solution
将多边形剖分成很多个三角形,有向面积就是有向重量,然后求出三角形的质心(坐标平均),然后求出这些质点的质心,这个质心就是多边形的质心。找出多边形在\(y\)轴上的点,只有最左边和最右边的点才可能成为支点。多边形的质心与指定顶点构成的新质心的\(x\)坐标一定要在这两个支点之间,多边形才不会倒。
所以分类判断多边形的质心是否在两个支点之间,再根据指定的顶点再分类讨论,注意讨论指定顶点的\(x\)坐标是否在支点上。

时间复杂度:\(O(n)\)

D - Game Strategy

题目描述:有\(n\)个点,每个点有若干个集合(总共有\(m\)个)。有两个人在玩游戏,一开始指针在某一个点,第一个人这个点的一个集合,第二人选择这个集合内的一个点,然后指针移向那个点。分别求出从每个点出发,其它点能否到达,如果能则输出最小步数,否则输出\(-1\)。(第二个人是阻止第一个人的)

solution
显然如果能到达某个点,则最小步数不超过\(n\),所以可以一步一步地走。显然答案是最长路径,然后暴力搜就好了。

时间复杂度:\(O(n^2m)\)

I - Sensor Network

题目描述:求一个无向图的最大团。

solution
随机一种\(n\)排列,然后按排列顺序构最大团。

时间复杂度:\(O(n^2*10000)\)

K - Surveillance

题目描述:给出\(n\)个数对\((a, b)\),如果\(a \leq b\),则表示区间\([a, b]\),如果\(a>b\),则表示区间\([1, b], [a, m]\),问最少需要多少个数对覆盖\([1, m]\)。

solution
将区间延长至\([1, 2m]\),则一个数对对应一个区间。那么问题变成最少区间覆盖一个长度至少为\(m\)的连续区间。
将区间按右端点排序,然后倍增求出一个区间\(i\)出发向左利用\(2^j\)个区间最左能到哪个区间,以及最长能覆盖多长的区间。然后再倍增求答案即可。

时间复杂度:\(O(nlogn)\)

ACM International Collegiate Programming Contest World Finals 2014的更多相关文章

  1. ACM International Collegiate Programming Contest World Finals 2013

    ACM International Collegiate Programming Contest World Finals 2013 A - Self-Assembly 题目描述:给出\(n\)个正方 ...

  2. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...

  3. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...

  4. Gym100814B Gym100814F Gym100814I(异或) ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology

    今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... Gym100814B 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把 ...

  5. [ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018)]

    https://codeforces.com/gym/101810 A. Careful Thief time limit per test 2.5 s memory limit per test 2 ...

  6. 2019.04.04 第二次训练 【ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)】

    题目链接:https://codeforces.com/gym/101853 A: ✅ B: (二分图匹配) https://blog.csdn.net/qq_41997978/article/det ...

  7. ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)

    A.Arcade Game(康拓展开) 题意: 给出一个每个数位都不同的数n,进行一场游戏.每次游戏将n个数的每个数位重组.如果重组后的数比原来的数大则继续游戏,否则算输.如果重组后的数是最大的数则算 ...

  8. Codeforces Gym100814 I.Salem-异或 (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)

    这个题就是二进制,找两个数相应的二进制相对应的位置上数不同的最多的个数.异或写就可以. 一开始还想麻烦了,找出来最大的偶数和最大的奇数,最小的偶数和最小的奇数,但是这样想考虑的不全.因为范围比较小,直 ...

  9. Codeforces Gym100814 F.Geometry (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)

    这个题真的是超级超级水啊,哈哈哈哈哈哈.不要被题面吓到,emnnn,就这样... 代码: 1 #include<iostream> 2 #include<cstring> 3 ...

随机推荐

  1. BZOJ 1212 L语言(DP+字典树)

    求能被理解的最长前缀. 很显然的dp.令dp[i]=true,表示前缀i能理解.否则不能理解.那么dp[i+len]=dp[i]=true,当s[len]能匹配str[i,i+len]. 由于模式串长 ...

  2. jmeter同步定时器

    同步定时器是jmeter中一个比较重要的定时器,同步定时器,相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,可以用来做大数据量的并发请求. 验证 ...

  3. asp.net core 登录身份认证(Cookie)

    asp.net core 2最简单的登录功能 源代码在此 创建asp.net core Web Mvc项目 配置下选项 项目目录结构 在Models文件夹下新建两个实体类 public class T ...

  4. HttpHelper类及调用

    首先列出HttpHelper类 /// <summary> /// Http操作类 /// </summary> public class HttpHelper { priva ...

  5. 解题:POI 2015 Pieczęć

    题面 发现好像没有什么好做法,那就模拟么=.= 以印章左上角的'x'为基准,记录印章上'x'的相对位置模拟.记录相对位置是因为可能有这种情况↓ 直接模拟是会漏掉的=.= #include<cst ...

  6. Linux基础--------centos7 安装python3(yum安装)

    #安装sqlite-devel yum -y install sqlite-devel #安装依赖 yum -y install make zlib zlib-devel gcc-c++ libtoo ...

  7. vector 一边遍历一边删除

    for(std::vector<int>::iterator it = m_ConnectId.begin();it!=m_ConnectId.end();){ ) < ){ m_C ...

  8. c++多态性详解(转)

    什么是多态? 多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,当然这只是字面意思,它在C++语言中多态有着更广泛的含义. 这要先从对象的类型说起!对象的类型有两种: 实例:Derived1类 ...

  9. bzoj2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1145  Solved: 378[Submit][Status][Discuss ...

  10. 安装vim with python

    http://note.youdao.com/noteshare?id=4eaddfef93696451de7ff890a6af3cc4