题意:有n(1<=n<=100)块水平不相交木板,一堆小鼠每个tmin从洞口出来,如果不碰到不动的小鼠(一直不动)会沿着原来的方向一直走,初始方向向右。
问最后最多有多少小鼠能够到达目的点和最后一个小鼠的到达时间。
题解:简单的Dijkstra最短路被我写的好丑,维护每个模板下方模板的编号,由于n小可以暴力。
Sure原创,转载请注明出处
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> #include <queue> #define ABS(x) ((x) >= 0 ? (x) : (-(x))) using namespace std; const int inf = 1 << 29; const int maxn = 110; struct BB { int x1,x2,y; int l,r; bool operator < (const BB &other) const { if(y == other.y) return x1 < other.x1; return y > other.y; } }seg[maxn]; struct ddd { int cost,val; int x,v,dir,up; bool operator < (const ddd &other) const { if(cost == other.cost) return val > other.val; return cost > other.cost; } }; priority_queue <ddd> Q; bool vis[maxn][2]; int dis[maxn][2][2]; int m,n,t,top; int sx,sy,ex,ey,fin; void read() { memset(vis,false,sizeof(vis)); scanf("%d %d %d %d %d",&sx,&sy,&ex,&ey,&m); top = 1; for(int i=1;i<=m;i++) { scanf("%d %d %d",&seg[top].x1,&seg[top].x2,&seg[top].y); if(seg[top].y <= sy && seg[top].y >= ey) { top++; } } sort(seg + 1 , seg + top); return; } bool make() { fin = -1; for(int i=1;i<top;i++) { if(seg[i].y == ey && seg[i].x1 <= ex && seg[i].x2 >= ex) { fin = i; break; } } if(fin == -1 || sy < ey) return false; while(!Q.empty()) Q.pop(); ddd tmp; for(int i=1;i<top;i++) { if(seg[i].y <= sy && seg[i].x1 <= sx && seg[i].x2 >= sx) { tmp.cost = 0; tmp.dir = 1; tmp.v = i; tmp.x = sx; tmp.val = 0; tmp.up = 0; Q.push(tmp); if(fin == i) return true; break; } } for(int i=1;i<top;i++) { seg[i].l = seg[i].r = -1; for(int j=i+1;j<top;j++) { if(seg[i].l == -1 && seg[j].x1 <= seg[i].x1 && seg[j].x2 >= seg[i].x1) { seg[i].l = j; } if(seg[i].r == -1 && seg[j].x1 <= seg[i].x2 && seg[j].x2 >= seg[i].x2) { seg[i].r = j; } if(seg[i].l != -1 && seg[i].r != -1) break; } dis[i][0][0] = dis[i][0][1] = dis[i][1][0] = dis[i][1][1] = inf; } return true; } inline bool relax(int x,int y,int a,int b) { if(a < x || (a == x && b < y)) return true; return false; } void bfs(bool flag) { if(flag == false) { puts("0 0"); return; } int num = inf,sum = inf; ddd cur,tmp; while(!Q.empty()) { cur = Q.top(); Q.pop(); if(cur.v == fin && cur.x == ex) { num = cur.cost; sum = cur.val; break; } int pos = cur.up < 0 ? 0 : 1; if(vis[ABS(cur.up)][pos]) continue; vis[ABS(cur.up)][pos] = true; if(cur.v == fin) { if(cur.x < ex) { if(cur.dir == 1) { if(relax(num , sum , cur.cost , cur.val + ex - cur.x)) { num = cur.cost; sum = cur.val + ex - cur.x; } } else if(cur.cost < n-1) { if(relax(num , sum , cur.cost + 1 , cur.val + ex - cur.x)) { num = cur.cost + 1; sum = cur.val + ex - cur.x; } } } else { if(cur.dir == -1) { if(relax(num , sum , cur.cost , cur.val - ex + cur.x)) { num = cur.cost; sum = cur.val - ex + cur.x; } } else if(cur.cost < n-1) { if(relax(num , sum , cur.cost + 1 , cur.val - ex + cur.x)) { num = cur.cost + 1; sum = cur.val - ex + cur.x; } } } } else if(cur.dir == 1) { tmp = cur; tmp.v = seg[cur.v].r; tmp.val += seg[cur.v].x2 - cur.x; tmp.x = seg[cur.v].x2; tmp.up = cur.v; if(tmp.v != -1 && vis[cur.v][1] == false && relax(dis[cur.v][1][0] , dis[cur.v][1][1] , tmp.cost , tmp.val)) { dis[cur.v][1][0] = tmp.cost; dis[cur.v][1][1] = tmp.val; Q.push(tmp); } if(cur.cost < n-1) { tmp = cur; tmp.cost++; tmp.dir = -1; tmp.v = seg[cur.v].l; tmp.val += cur.x - seg[cur.v].x1; tmp.x = seg[cur.v].x1; tmp.up = -cur.v; if(tmp.v != -1 && vis[cur.v][0] == false && relax(dis[cur.v][0][0] , dis[cur.v][0][1] , tmp.cost , tmp.val)) { dis[cur.v][0][0] = tmp.cost; dis[cur.v][0][1] = tmp.val; Q.push(tmp); } } } else { tmp = cur; tmp.v = seg[cur.v].l; tmp.val += cur.x - seg[cur.v].x1; tmp.x = seg[cur.v].x1; tmp.up = -cur.v; if(tmp.v != -1 && vis[cur.v][0] == false && relax(dis[cur.v][0][0] , dis[cur.v][0][1] , tmp.cost , tmp.val)) { dis[cur.v][0][0] = tmp.cost; dis[cur.v][0][1] = tmp.val; Q.push(tmp); } if(cur.cost < n-1) { tmp = cur; tmp.cost++; tmp.dir = 1; tmp.v = seg[cur.v].r; tmp.val += seg[cur.v].x2 - cur.x; tmp.x = seg[cur.v].x2; tmp.up = cur.v; if(tmp.v != -1 && vis[cur.v][1] == false && relax(dis[cur.v][1][0] , dis[cur.v][1][1] , tmp.cost , tmp.val)) { dis[cur.v][1][0] = tmp.cost; dis[cur.v][1][1] = tmp.val; Q.push(tmp); } } } } if(sum < inf) printf("%d %d\n",n - num , (n-1) * t + sum + sy - ey); else puts("0 0"); return; } int main() { while(~scanf("%d %d",&n,&t)) { read(); bfs(make()); } return 0; }