poj 3817Robot Challenge
来源:互联网 发布:java绘图教程 编辑:程序博客网 时间:2024/06/02 03:41
Robot Challenge
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 478 Accepted: 187
Description
You have entered a robot in a Robot Challenge. A course is set up in a 100m by 100m space. Certain points are identified within the space as targets. They are ordered – there is a target 1, a target 2, etc. Your robot must start at (0,0). From there, it should go to target 1, stop for 1 second, go to target 2, stop for 1 second, and so on. It must finally end up at, and stop for a second on, (100,100).
Each target except (0,0) and (100,100) has a time penalty for missing it. So, if your robot went straight from target 1 to target 3, skipping target 2, it would incur target 2?s penalty. Note that once it hits target 3, it cannot go back to target 2. It must hit the targets in order. Since your robot must stop for 1 second on each target point, it is not in danger of hitting a target accidentally too soon. For example, if target point 3 lies directly between target points 1 and 2, your robot can go straight from 1 to 2, right over 3, without stopping. Since it didn't stop, the judges will not mistakenly think that it hit target 3 too soon, so they won't assess target 2's penalty. Your final score is the amount of time (in seconds) your robot takes to reach (100,100), completing the course, plus all penalties. Smaller scores are better.
Your robot is very maneuverable, but a bit slow. It moves at 1 m/s, but can turn very quickly. During the 1 second it stops on a target point, it can easily turn to face the next target point. Thus, it can always move in a straight line between target points.
Because your robot is a bit slow, it might be advantageous to skip some targets, and incur their penalty, rather than actually maneuvering to them. Given a description of a course, determine your robot's best (lowest) possible score.
Each target except (0,0) and (100,100) has a time penalty for missing it. So, if your robot went straight from target 1 to target 3, skipping target 2, it would incur target 2?s penalty. Note that once it hits target 3, it cannot go back to target 2. It must hit the targets in order. Since your robot must stop for 1 second on each target point, it is not in danger of hitting a target accidentally too soon. For example, if target point 3 lies directly between target points 1 and 2, your robot can go straight from 1 to 2, right over 3, without stopping. Since it didn't stop, the judges will not mistakenly think that it hit target 3 too soon, so they won't assess target 2's penalty. Your final score is the amount of time (in seconds) your robot takes to reach (100,100), completing the course, plus all penalties. Smaller scores are better.
Your robot is very maneuverable, but a bit slow. It moves at 1 m/s, but can turn very quickly. During the 1 second it stops on a target point, it can easily turn to face the next target point. Thus, it can always move in a straight line between target points.
Because your robot is a bit slow, it might be advantageous to skip some targets, and incur their penalty, rather than actually maneuvering to them. Given a description of a course, determine your robot's best (lowest) possible score.
Input
There will be several test cases. Each test case will begin with a line with one integer, N (1 ≤ N ≤ 1000) which is the number of targets on the course. Each of the next N lines will describe a target with three integers, X, Y and P, where (X,Y) is a location on the course (1 ≤ X,Y ≤ 99, X and Y in meters) and P is the penalty incurred if the robot misses that target (1 ≤ P ≤ 100). The targets will be given in order – the first line after N is target 1, the next is target 2, and so on. All the targets on a given course will be unique – there will be at most one target point at any location on the course. End of input will be marked by a line with a single 0.
Output
For each test case, output a single decimal number, indicating the smallest possible score for that course. Output this number rounded (NOT truncated) to three decimal places. Print each answer on its own line, and do not print any blank lines between answers.
Sample Input
150 50 20330 30 9060 60 8010 90 100330 30 9060 60 8010 90 100
Sample Output
143.421237.716154.421
#include<iostream>#include<string>#include<cmath>#include<algorithm>#include<stdlib.h>#include<stdio.h>using namespace std;struct node{ double x,y; //坐标 double val; //罚时};double pt[1010];int main(){ int n,i,k,j;//freopen("D:\\in.txt","r",stdin); while(cin>>n&&n) { node *tar=new node[n+3]; //存储目标信息 double *dp=new double[n+3]; //到达节点i时的最小耗时 for(i=1;i<=n;i++) { cin>>tar[i].x>>tar[i].y>>tar[i].val; } tar[0].x=0; tar[0].y=0; tar[0].val=0; tar[n+1].x=100; tar[n+1].y=100; dp[0]=0;memset(pt,0,sizeof(pt)); // 动态方程: dp[i]=min{dp[j]+(j~i的罚时)+j到达i的距离}+1 for(i=1;i<=n+1;i++) //第n+1个节点表示(100,100)终点 {pt[i]=pt[i-1]+tar[i].val; double min1=10000000; for(j=0;j<i;j++) { double d=dp[j];d+=pt[i-1]-pt[j];if(d>min1)continue; d+=(sqrt((double)(tar[i].x-tar[j].x)*(tar[i].x-tar[j].x)+(tar[i].y-tar[j].y)*(tar[i].y-tar[j].y))); if(d<min1) min1=d; } dp[i]=min1+1; } printf("%.3lf\n",dp[n+1]); delete []tar; delete []dp; } return 0;}
注意:
这道题目利用动态规划做,这很多人都能想到
我刚开始时总是超时,然后又对罚时的部分利用动态规划做了一下处理
结果可以AC
- poj 3817Robot Challenge
- POJ 3817 Robot Challenge (DP)
- GYM 100182 H.Robot Challenge(dp)
- 【bzoj2288】【POJ Challenge】生日礼物
- poj 1573 Robot Motion
- Poj 1573 Robot Motion
- poj 1376 Robot
- poj 2688 Cleaning Robot
- poj 1376 Robot
- poj 1573 Robot Motion
- poj 1376 Robot BFS
- POJ 1573 - Robot Motion
- poj-1573-Robot Motion
- POJ 1573 Robot Motion
- POJ 1573 Robot Motion
- POJ-1376-Robot
- POJ-1573-Robot Motion
- POJ 1753 Robot Motion
- [C# 线程处理系列]专题一:线程基础
- thoughts
- DirectX简单了解
- hdu 1285 确定比赛名次 topo
- 自己的方向
- poj 3817Robot Challenge
- [教程]MongoDB 从入门到进阶 (TextSearch)
- html标签之视频各种标签
- qt5.02使用webview的问题
- 关于SQL Server 2008 无法修改表的问题
- String,StringBuffer与StringBuilder的区别??
- CF:Eugeny and Array
- [C# 线程处理系列]专题二:线程的详细使用
- 编译运行AspectJ自带的tracing示例