[TC SRM 662 div1 lev1] FoxesOfTheRoundTable

转载:http://codeforces.com/blog/entry/19151

Note: 将问题转化为寻找hamiltonian回路问题。证明过程值得一看。

Suppose the heights are sorted: h[0] <= h[1] <= h[2] ...

In one hand, we know the answer can‘t be smaller than max{x[i+2] — x[i]}. We can proof this in the following way: If abs(x[i]-x[j]) >= ans, we add an edge between i and j. We assume there is an i and ans < x[i+2]-x[i]. Then if the graph is connected, edges (i, i+1) and (i+1, i+2) will be bridege (since if x < i and y > i+2 then there is no edge between x and y.) It means this graph don‘t have a hamiltonian cycle, so we can‘t arrange these foxes around a round table.

In another hand, we know that we have a solution that ans = max{x[i+2]-x[i]}: x[0]-x[2]-x[4]-x[6]-...-n-...x[5]-x[3]-x[1]-x[0].

So we know this solution is optimal.

时间: 2024-12-25 00:07:48

[TC SRM 662 div1 lev1] FoxesOfTheRoundTable的相关文章

[TC SRM 697 div1 lev1] DivisibleSetDiv1

Tutorial:https://apps.topcoder.com/wiki/display/tc/SRM+697#DivisibleSetDiv1 Note:证明过程值得一看. 主要内容:寻找[x1,x2,...,xn]使得满足bi * xi >= S - xi,其中S = x1 + x2 + ... + xn.

Topcoder SRM 662 DIV1

FoxesOfTheRoundTable 题意: 给你一个序列,让你生成一个排列,并且这个排列是循环的.使得任意两个相邻数的差的最大值尽量小. 题解: 先排个序,然后从小到大逐个插入.这时容易发现,若要得到最优的策略,只能将现在的这个数插在当前排列中最大的那个数的旁边,这是因为,要插入的这个数是大于当前排列中的任何一个数,故而插入只会产生一个更大的差距,为了使这个差距尽量小,就不得不在最大的数旁边插入. 假如现在的序列就是0 1 2 3 4 5 首先前三个数是没有影响的:0 1 2 插入3:0

topcoder srm 662 div1 -3

1.给出$n$个数字将其排列成一个环,使得相邻两个数字差的最大值最小. 思路:首先排序.然后从最小的数字开始,依次枚举将下一个数字放在左侧或者右侧.令$f[i][j][k]$表示已经放置了$i$个数字,其中左侧的最大数字编号是$j$,右侧最大数字编号是$k$的最小差值. #include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <vecto

TC SRM 638 DIV1 600 NarrowPassage2

Problem Statement 在一个狭长的通道中有$n$只狼,每只狼的体积为$size_i$,如果相邻的两只狼体积不超过$m$,则可以交换位置,求可以有多少种排列. $n≤50,1≤m≤1,000,000,000$ Tutorial 每次选出区间中体积最大的狼,如果其他狼可以越过它,那么即可在整个区间里自由移动,而不能越过它的狼则被隔离到两个区间里,可以分治. 区间总共有$n$只狼,能自由移动的狼个数为$cnt$,那么最后结果等于$$solve(l)*solve(r)*A_{n}^{cnt

TC SRM 637 DIV1 500 PathGame

Problem Statement 给一个2*1000的board,每个格子黑或者白.白格子从左到右连成一条连接第一列和最后一列的path,path上相邻两格有公共边.两人轮流把白格子涂成黑格子,最后一个被迫涂黑格子使path断开的人输.问先手必胜还是必败. (Translated By myq_952) Tutorial 做sg的题有点生(有什么生不生的不就dp嘛) 考虑以一段2*k的全白矩形作为局面,涂黑一个格子会把原局面拆成两个后继局面,然后$n^2$求局面的sg即可 要注意的是,因为本题

TC SRM 655 DIV1 250,500pt

250: 给一个n*n的格子图,每个格子颜色为白色或者红色.假设刚开始都是白色,每次可以涂k*k的一块正方形格子区域,涂成红色或白色,后面涂的可以覆盖前面涂的.给你最终状态,问从初始状态涂任意次数,可不可以涂成最终状态. 挺不错的题,感觉比500有意思.刚开始想简单了,就从前往后枚举,碰到跟最终状态不同就涂.很显然错了.其实实质还是贪心,因为后涂的覆盖前面涂的,所以从最后开始考虑,每次选一块完整颜色相同的出来,涂成该颜色,然后以后该区域的颜色就不会变了,这样贪心的每次选一块可以涂的区域出来,直到

TC srm 673 300 div1

TC srm.673 300 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 Description 给你n(n<=50)匹马和n个人,一匹马和一个人能够组成一个骑兵,这个骑兵的战斗力等于马的战斗力乘以人的战斗力,问你有多少种组合方式满足其他骑兵的战斗力都不超过第0号骑兵. Input Output Sample Input Sample Output HINT 题意 题解: 大概就暴力枚举哪匹马和第0号人匹配,后面的骑兵我们按照战斗力从大到小排序之后,

Topcoder SRM 643 Div1 250&lt;peter_pan&gt;

Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*......*pn,我们假设p0,p1,...,pn是单调不降的,那么v里存储的是下标为偶数 的N的质因数p0,p2,p4,...,p(2k).现在要求写一个程序,返回一个vector<long long>ans; ans里存储的是p0,p1,p2,...,pn. Limits Time Limit(m

SRM 618 DIV1 500

非常棒的组合问题,看了好一会,无想法.... 有很多做法,我发现不考虑顺序的最好理解,也最好写. 结果一定是两种形式 A....A   dp[n-1] A...A...A sgma(dp[j]*dp[n-j-1])( 1<=j<=n-2) 最后乘上n! 什么时候才能自己在比赛中做出一个500分来啊!!! class LongWordsDiv1 { public : int count(int n) { int i,j; fact[0] = 1; for(i = 1; i <= n; i