解题报告:HDU_6136:Death Podracing (优先队列+循环链表)
来源:互联网 发布:本地数据库搭建 编辑:程序博客网 时间:2024/05/18 13:46
题目链接
题意:
n个人以不同的速度在环上顺时针或逆时针移动,每次相遇,移除下标小的,问最后只剩下一个人的时间的分数形式
官方题解及思路:
也不是第一次写循环链表的题了,还是写了好久。。
注意维护循环链表时要同时更新左右指针
代码:
#include<bits/stdc++.h>const int N = 1e5+10;using namespace std;struct node{ double val; int d,v,id,w,l; node(){val=0;} node(double a,int b,int c,int i=0,int _w=0,int _l=0){ val = a;d = b;v = c;id = i;w = _w;l = _l; }bool operator <(const node& a)const { return val > a.val; }}A[N];bool cmp(node a,node b){ return a.d<b.d;}int n,l;int R[N],L[N];bool used[N];priority_queue< node >Q;node oper(int x,int y){ if(x==y)return node(0,0,0,0,x,y); int d , v , w=A[x].id>A[y].id?x:y; if(A[x].v>0){ if(A[y].v<=0){d = A[y].d - A[x].d;v = A[x].v - A[y].v;} else { if(A[y].v<A[x].v){d = A[y].d - A[x].d;v = A[x].v - A[y].v;} else {d = l + A[x].d - A[y].d;v = A[y].v - A[x].v;} } }else {//A[x].v<=0 if(A[y].v>0){d = l + A[x].d - A[y].d;v = A[y].v - A[x].v;} else {//A[y].v<=0 if(A[y].v>A[x].v){d = l + A[x].d - A[y].d;v = A[y].v - A[x].v;} else {d = A[y].d - A[x].d;v = A[x].v - A[y].v;} } } return node(1.0*d/v,d,v,0,w,x^y^w);}int main(){ //freopen("1004.in","r",stdin); //freopen("my_1004.out","w",stdout); int T; scanf("%d",&T); while(T--){ while(!Q.empty())Q.pop(); scanf("%d%d",&n,&l); memset(used,0,sizeof(used)); for(int i=0;i<n;i++)scanf("%d",&A[i].d),L[i]=i-1,R[i]=i+1,A[i].id=i; for(int i=0;i<n;i++)scanf("%d",&A[i].v);R[n-1]=0,L[0]=n-1; sort(A,A+n,cmp); for(int i=0,j=1;i<n;i++){ if(j)Q.push(oper(i,j)); else Q.push(oper(j,i)); if(++j==n)j=0; }node ans ; while(!Q.empty()){ node tmp = Q.top();Q.pop(); if(tmp.w==tmp.l)break; if(used[tmp.w]||used[tmp.l])continue; if(tmp.val>ans.val)ans = tmp; used[tmp.l]=true; int y,x=tmp.w; if(L[tmp.w]==tmp.l){ y = L[x]; while(used[y])y=L[y]; L[x] = y;R[y] = x; }else if(R[tmp.w]==tmp.l){ y = R[x]; while(used[y])y=R[y]; R[x] = y;L[y] = x; }if(x>y)swap(x,y); Q.push(oper(x,y)); }int gcd = __gcd(ans.d,ans.v); printf("%d/%d\n",ans.d/gcd,ans.v/gcd); }return 0;}
阅读全文
0 0
- 解题报告:HDU_6136:Death Podracing (优先队列+循环链表)
- HDU 6136 Death Podracing(优先队列+循环链表)
- HDU 6136 Death Podracing 优先队列 + 循环链表(模拟)
- HDU 6136 Death Podracing(优先队列+双向链表)
- 2017多校联合第八场/hdu 6136Death Podracing(优先队列+循环链表)
- 【多校训练】hdu 6136 Death Podracing 优先队列
- Death Podracing HDU
- Death Knight Hero解题报告
- POJ-2010-优先队列(解题报告)
- poj2051解题报告(优先队列)
- HDU 6136 Death Podracing [链表]
- hdu 1242 Rescue bfs+优先队列 解题报告
- hdu 1180 诡异的楼梯 bfs+优先队列 解题报告
- hdu Magic maze bfs+优先队列 解题报告
- Poj Jungle Road (优先队列Prim算法) 解题报告
- Leetcode #61. Rotate List 循环位移链表 解题报告
- 优先队列与循环队列
- [解题报告]POJ 1521 ZOJ 2399 POJ 3253 哈夫曼树,优先队列
- Mac Google跨域设置
- CSU1808(不能以点建图,以边建图的分析)
- 浅析C++内存管理
- hdu 1269 迷宫城堡(Tarjan算法)
- 初始化img-loader
- 解题报告:HDU_6136:Death Podracing (优先队列+循环链表)
- 人脑拆机三部曲:为什么我支持马斯克,而人类应该畏惧人工智能
- VS常用快捷键
- HDU
- 记录ArcGIS Server打印服务出现的问题
- linux实验楼学习笔记9
- ios在uiwebview执行js方法
- java读取文件
- 【算法】3、堆排序