Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
一份比较易读的样例代码// 一份比较易读的样例代码 // 这道题坑很多 // 1. 题目描述不清楚,蜘蛛侠每次切换大楼的高度是一致的,由第一栋build(apartment)决定 // 2. 最后一个build(tower)不一定需要荡过去,只要前一个build摆荡的终点越过了就ok // 3. sqrt需要转换所有内部数字到double类型,否则会因为转换成int,精度损失导致wa #include <iostream> #include <cmath> #include <string.h> using namespace std; typedef struct _BUILD_POS { int x; int y; }BUILD_POS; const int MAX_BUILD_COUNT = 5000+10; const int MAX_X_RANGE = 1000000+100; int get_radius(BUILD_POS b1, BUILD_POS b2) { return (int)sqrt((double)b2.y*(double)b2.y - (double)(b2.y - b1.y) * (double)(b2.y - b1.y)); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); int k; scanf("%d", &k); while(k--) { int build_count; scanf("%d", &build_count); BUILD_POS build[MAX_BUILD_COUNT]; int dp[MAX_X_RANGE]; int ans = 0x7fffffff; memset(dp, 0x4f, sizeof(dp)); for (int i = 0; i < build_count; i++) { scanf("%d %d", &build[i].x, &build[i].y); } dp[build[0].x] = 0; for (int i = 1; i < build_count; i++) { int radius = get_radius(build[0], build[i]); for (int j = build[i].x - radius; j < build[i].x; j++) { if (j<0) continue; int swing_end_point = build[i].x + (build[i].x - j); if (swing_end_point < build[build_count-1].x && dp[swing_end_point] > dp[j] + 1) { dp[swing_end_point] = dp[j] + 1; } if (swing_end_point >= build[build_count-1].x && ans > dp[j]+1) { ans = dp[j]+1; } } } if (ans >= 5001) { printf("-1\n"); } else { printf("%d\n", ans); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator