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 ...
随机推荐
- 17-list,字典使用练习
randint(a,b)包括 [a,b]中随机, 包含a,b range(n)= 0,1,2,3....n-1 chr() 数字转字符: chr(65) 得到 :A ord()字符转数字: ord( ...
- Mosquitto 单向SSL配置
Mosquitto 单向SSL配置 摘自:https://blog.csdn.net/a_bcd_123/article/details/70167833 2017年04月14日 06:56:06 s ...
- python report中文显示乱码
环境:python2.7 测试框架: nose (1.3.7) nose-html-reporting (0.2.3) 问题:生成测试报告失败的时候,报告会抓取代码中的print,打开后看到的中文是乱 ...
- HDU 6007 Mr. Panda and Crystal (背包+spfa)
题意:你生活在一个魔法大陆上,你有n 魔力, 这个大陆上有m 种魔法水晶,还有n 种合成水晶的方式,每种水晶价格告诉你,并且告诉你哪些水晶你能直接造出来,哪些你必须合成才能造出来,问你n魔力最多能卖多 ...
- CodeForces 288A Polo the Penguin and Strings (水题)
题意:给定一个字符,让你用前 k 个字符把它排成 n 长度,相邻的字符不能相等,并且把字典序最小. 析:其实很简单么,我们只要多循环ab,就行,最后再把剩下的放上,要注意k为1的时候. 代码如下: # ...
- Mac Android8.0源码编译笔记
原因:内存不够 办法:添加限制,输入如下命令:export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompil ...
- 编写高质量代码改善C#程序的157个建议——建议141:不知道该不该用大括号时,就用
建议141:不知道该不该用大括号时,就用 如果if条件语句只有一行语句,要不要使用大括号? 答案是:建议使用.一个括号不会增加多少代码,但是却让代码看上去增加了一致性.括号本身只会让代码更具条理性. ...
- CentOS 7.2安装zabbix 3.0 LTS
1.zabbix简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供 ...
- VC中CRect类的简单介绍
CRect CRect类与Windows RECT结构相似,并且还包括操作CRect对象和Windows RECT结构的成员函数.在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都 ...
- linux 系统启动
系统启动流程 BIOS 我们称之为基本输入输出系统,一般保存在主板上的BIOS芯片中,负责检查硬件并且查找可启动设备:可设置启动顺序: 如果一个设备是可启动,那么第一个扇区512字节的最后两字节是55 ...