POJ2259 Team Queue (JAVA)
第一次TLE,对每个group重新设置Queue中定位,定位到每个group的最后一个元素,但WA
经过检查,DEQUEUE时没有根据情况重新计算group,插入时没有根据情况重新给last赋值
贴AC代码
import java.util.*;
public class POJ2259 {
static class Member{
String value;
int group;
//因为更新group数组会用到pre,所以得做一个双向链表
Member next;
Member pre; public Member(String value, int group, Member next,Member pre) {
this.value = value;
this.group = group;
this.pre = pre;
this.next = next;
}
} static Map<String,Member> members;//根据元素名称获取元素对象,用散列比较快
static Scanner sc = new Scanner(System.in);
static Member first;//列表头
static Member last;//列表尾
static Member[] gindicator;//记录每个group最后一个元素在列表中的位置 static void doQueueOp(){
String[] s=sc.nextLine().split(" ");
while (!s[0].equals("STOP")){
if(s.length==2){
// ENQUEUE x
//首先根据元素名称获取元素对象
String name = s[1];
Member m = members.get(name);
//检查团队中是否已经有队友在队列中
int group = m.group;
//没有队友在队列中,排在队列最后
if(gindicator[group]==null){
gindicator[group]=m;
//要记得更新last
last.next=m;
m.next=null;
m.pre=last;
last=m;
}
//有队友,排在团队最后一个队友最后
//gindicator[groupid]记录了团队最后一个队友的位置,所以直接排在group[groupid]后面就行
else {
m.next=gindicator[group].next;
if(gindicator[group].next!=null){
gindicator[group].next.pre=m;
}
m.pre=gindicator[group];
gindicator[group].next=m;
//如果队友正好是队列最后一个,需要更新last
if(last==gindicator[group]){
last=m;
}
gindicator[group]=m;
}
}
//DEQUEUE
else {
//如果队列不空,删除队列第一个元素
if(first.next!=null) {
Member m = first.next;
first.next = m.next;
if(m.next != null){
m.next.pre=first;
}
//如果队列只有一个元素,需要更新last
if(last==m){
last=m.pre;
}
//要记得更新gindicator
if(gindicator[m.group]==m){
//如果m是团队中唯一一个元素,把gindicator[groupid]置空
if(m.pre==null) {
gindicator[m.group] = null;
}
//否则把gindicator[groupid]置为m的前一个队友
//这里需要用到m.pre,所以做双向链表
else {
if(m.pre.group==m.group){
gindicator[m.group]=m.pre;
}else {
gindicator[m.group] = null;
}
}
}
System.out.println(m.value);
}
}
s=sc.nextLine().split(" ");
}
} public static void main(String[] args) {
int n = Integer.parseInt(sc.nextLine());
int so=1;
while (n != 0){
members = new HashMap<String,Member>();
//根据元素名称散列
for(int i=0;i<n;i++){
String[] s = sc.nextLine().split(" +|,");
for(int j=1;j<s.length;j++){
String name = s[j];
Member m = new Member(name,i,null,null);
members.put(name,m);
}
}
gindicator = new Member[n];
first = new Member("-1",-1,null,null);
last = first;
System.out.println("Scenario #"+so);
doQueueOp();
System.out.println();
so++;
n = Integer.parseInt(sc.nextLine());
}
}
}
POJ2259 Team Queue (JAVA)的更多相关文章
- poj-2259 team queue(数据结构)
第一遍看的时候立即想到了哈希表. 再想时觉得两个队列,一个用来排队伍之间的顺序,一个用来排队伍内部成员的顺序即足够了. DEQUE的时候先判断哪只队伍排在队首,之后再让该队伍中的首队员出列. 整体没有 ...
- [POJ2259]Team Queue (队列,模拟)
2559是栈,2259是队列,真的是巧啊 题意 模拟队列 思路 水题 代码 因为太水,不想打,发博客只是为了与2559照应,于是附上lyd的std #include <queue> #in ...
- poj2259 Team Queue
吼哇,又是水题. 我本来准备开1010个queue的,但是STL容器里好像只有vector滋磁开组,于是只好数组模拟... 然后模拟过了...... #include <cstdio> # ...
- hdu 1387(Team Queue) STL
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 1387 Team Queue
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Team Queue(多队列技巧处理)
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Team Queue(STL练习题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1387 Team Queue Time Limit: 2000/1000 MS (Java/Others ...
- UVA 540 Team Queue(模拟+队列)
题目代号:UVA 540 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page ...
- HDU 1387 Team Queue( 单向链表 )
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声 ...
- system存储说明和制作os模板时的注意事项
1.通过ISO制作模板时,安装机器后,使用非持久化磁盘安装后,无法从硬盘引导:使用持久化磁盘可以.2.system 存储,当opennebula 初次部署时,会生成0(system),1(image) ...
- 9个使用前必须再三小心的 Linux 命令-乾颐堂
Linux shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹.文件或者路径文件夹等被删除. 在一些情况下,Linux 甚至不会询问你而直接执行命令,导致你丢失各种数据信息 ...
- redhad系统配置daocloud加速器
一.注册daocloud账户网址:http://www.daocloud.io/ 配置加速器需要在daocloud上注册一个用户.注册之后,登陆进去可以看到[加速器]选项. 点击加速器选项之后,就可以 ...
- JVM内存模型以及堆分配参数
程序计数器: 存放下一条要运行的指令:每个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令.程序计数器是一块线程私有的内存空间. JAVA虚拟机栈: 线程私有的内存空间,它保存方法的局部变 ...
- How to count the number of threads in a process on Linux
If you want to see the number of threads per process in Linux environments, there are several ways t ...
- hbase项目
四.HBase 项目4.1.涉及概念梳理:命名空间4.1.1.命名空间的结构 1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定, 则在 default 默认的命名 ...
- Mysql主主复制+keepalived
1>环境 Master1 10.0.0.201 Master2 10.0.0.202 2>Master1操作授权 mysql>grant replication slave on * ...
- Android Studio3.2新建项目gradle read time out
试验了好几个小时,看了很多方法,都不管用,运用一下设置好了,记录一下 1. 2.在项目的build.gradle中添加 mavenCentral()maven { url 'https://maven ...
- [java]基于UDP的Socket通信Demo
java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过 ...