Topcoder SRM 547 DIV1 Level 1: Pillars
2013-06-25 00:19
519 查看
题目: http://community.topcoder.com/stat?c=problem_statement&pm=12055&rd=14739
题目大意:对所有的1<=x<=X, 1<=y<=Y和给定的w, 求s = sqrt(w*w + (x-y)*(x-y))的平均值。
解题报告:
如果枚举所有可能情况,则时间复杂度为O(X* Y),该题中X和Y分别最大值为100000,显然暴力枚举过不了测试。具体分析发现公式S显然只随着d=y-x在变化,原来的枚举空间中有很多次重复的计算。假设y>x(如果不大于,交换两个数), 则d=1,2,...,K=Y-X 分别有X条;d= K+1, K+2, ..., Y-1分别有X-1,X-2,...,1条; d= -1, -2, ..., -X+1分别有X-1,X-2,...,1条。分别求出d=1,2,。。。,Y-1的各个边长,再求和取平均,即可得最终结果。
时间复杂度为O(max{X,Y }).
解法二:动态规划求解
Let's have a look at the sum of all possible lengthes. Let d(i, j) be the length between two pillars with heights i and j. Then we have the following sum:
Obviuosly d(i,j)=d(j,i) and d(i-1,j-1)=d(i,j). We can assume that x<=y and then:
Let f(n) be the sum d(1,2)+...+d(1,n). Then
Code
题目大意:对所有的1<=x<=X, 1<=y<=Y和给定的w, 求s = sqrt(w*w + (x-y)*(x-y))的平均值。
解题报告:
如果枚举所有可能情况,则时间复杂度为O(X* Y),该题中X和Y分别最大值为100000,显然暴力枚举过不了测试。具体分析发现公式S显然只随着d=y-x在变化,原来的枚举空间中有很多次重复的计算。假设y>x(如果不大于,交换两个数), 则d=1,2,...,K=Y-X 分别有X条;d= K+1, K+2, ..., Y-1分别有X-1,X-2,...,1条; d= -1, -2, ..., -X+1分别有X-1,X-2,...,1条。分别求出d=1,2,。。。,Y-1的各个边长,再求和取平均,即可得最终结果。
时间复杂度为O(max{X,Y }).
解法二:动态规划求解
Let's have a look at the sum of all possible lengthes. Let d(i, j) be the length between two pillars with heights i and j. Then we have the following sum:
S=d(1,1)+d(1,2)+...+d(1,y)+d(2,1)+d(2,2)+...+d(2,y)+...+d(x,1)+...+d(x,y).
Obviuosly d(i,j)=d(j,i) and d(i-1,j-1)=d(i,j). We can assume that x<=y and then:
S=d(1,1)+d(1,2)+...+d(1,y)+d(1,2)+d(1,1)+d(1,2)+..+d(1,y-1)+...+d(1,x)+d(1,x-1)+...+d(1,y-x+1).
Let f(n) be the sum d(1,2)+...+d(1,n). Then
S=f(y)+f(1)+d(2,2)+f(y-1)+f(2)+d(3,3)+f(y-2)+...+f(x-1)+d(x,x)+f(y-x+1).
s = sum {f[x] + w + f[y-x+1]} {1<=x<=X, w = d[x,x]}
Code
class Pillars { public double getExpectedLength(int w, int x, int y) { double result = 0; if (y < x) { int tmp = y; y = x; x = tmp; } int delta = y - x; for (int i = 0; i <= delta; i++) { double z = 1.0 * x; result += z * System.Math.Sqrt( 1.0 *w * w + 1.0 * i * i); } for (int i = delta + 1; i < y; i++) { double z = 1.0 * (y - i); result += z * System.Math.Sqrt(1.0 * w * w + 1.0 * i * i); } for (int i = 1; i < x; i++) { double z = 1.0 * (x - i); result += z * System.Math.Sqrt(1.0 * w * w + 1.0 * i * i); } return result/x/y; } public double getExpectedLength2(int w, int x, int y) { double[] f = new double[100001]; int N = System.Math.Max(x, y); f[1] = 0; for (int i = 2; i <= N; i++) { double d = distance(w, i - 1); f[i] = (f[i - 1] + d); } double sum = 0; for (int i = 1; i <= x; i++) { sum += f[i] + w + f[y - i + 1]; } return sum / x / y; } private static double distance(int w, int d) { double x = 1.0 * w * w + 1.0 * d * d; return System.Math.Sqrt(x); } }
相关文章推荐
- SRM 483 Div II Level Two: MovieSeating, TopCoder上正确率不到%10的题
- TopCoder SRM 558 DIV2 Level 3:CatAndRabbit
- topcoder srm 451 div2 level 3 PizzaDelivery
- Topcoder SRM 452 div 2 level 3 HamiltonPath
- TopCoder SRM 569 DIV2 Level3: MegaFactorialDiv2
- SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法
- topcoder srm 696 div1 -3
- SRM 207 Div II Level One: TransportCounting
- Topcoder SRM 676 div2
- SRM 219 Div II Level Two: HealthFood
- SRM 222 Div II Level Two: GroceryBagger,STL map 用法
- Topcoder SRM 638 DIV 2 (大力出奇迹)
- topcoder srm 680 div1 -3
- [TopCoder] SRM 578 DIV 2, Goose In Zoo, Solution
- TopCoder SRM 474 DIV1 1000
- Topcoder SRM144 div2 1100
- 【TopCoder】SRM 680 DIV 2
- [LP对偶 & 最大费用可行流] TopCoder SRM 676 div1 Farmville
- TopCoder SRM 644 Div2 Problem 500 - LostCharacter (贪心)
- topcoder: TCHS10 Championship Round DIV 1 (lucky number third level)