标签:operator com algorithm 整数 node 测试数据 scanf opened src
Input
Output
#include<iostream> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<cstdio> using namespace std; const int maxn = 1000+10; struct node { int x,y,h; friend bool operator < (node a, node b) { return a.h<b.h; } }a[maxn]; int sx,sy,n,mmax; int dp[maxn][3]; int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d%d%d", &n, &sx, &sy, &mmax); for(int i=1;i<=n;i++) { scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].h); dp[i][0]=dp[i][1]=1e9; } dp[n+1][0]=dp[n+1][1]=1e9; sort(a+1,a+n+1); a[n+1].x=sx, a[n+1].y=sx, a[n+1].h=sy; a[0].x=-3000; a[0].y=3000; a[0].h=0; for(int i=1;i<=n+1;i++) { bool zuo=true, you=true; for(int j=i-1;j>=0;j--) { if(a[i].h-a[j].h>mmax) break; if((!zuo) && (!you)) break; if(zuo) { if(j==0) { dp[i][0]=a[i].h; zuo=false; } else { if(a[i].h-a[j].h<=mmax) { if(a[j].x<=a[i].x && a[j].y>=a[i].x) { dp[i][0]=a[i].h-a[j].h+min(dp[j][0]+a[i].x-a[j].x, dp[j][1]+a[j].y-a[i].x); zuo=false; } }} } if(you) { if(j==0) { dp[i][1]=a[i].h; you=false; } else { if(a[i].h-a[j].h<=mmax) { if(a[j].x<=a[i].y && a[j].y>=a[i].y) { dp[i][1]=a[i].h-a[j].h+min(dp[j][0]+a[i].y-a[j].x,dp[j][1]+a[j].y-a[i].y); you=false; } }} } } } printf("%d\n", dp[n+1][0]); } }
标签:operator com algorithm 整数 node 测试数据 scanf opened src
原文地址:http://www.cnblogs.com/Superwalker/p/7978175.html