二叉堆,老是WA,请问错误在哪,我实在找不出~

csdon000 2012-03-23 12:26:34
http://acm.dlut.edu.cn/problem.php?id=1081
Description

三国演义有记载,新野一战,刘备以少胜多打败曹操,曹操引五十万大军前来报仇。刘备的三千人马走到当阳县,突然被曹兵截住,战到天明才摆脱曹兵的追赶,护卫刘备家小的赵云发现不见了刘备,走散了糜夫人母子,急集合三十骑,又杀回乱军中寻找。赵云在一位大嫂的指引下,在一截断墙后面的枯井旁找到糜夫人母子。糜夫人说:"见到将军阿斗有救了,……我死而无恨!"说完,趁赵云不注意跳井身亡。这时曹兵向这边杀来,赵云含泪推倒土墙埋了夫人,急忙抱起阿斗往外冲。曹将杀来,战三回合,被赵云杀死。赵云力战众将,威武勇猛。正在山上观战的曹操见赵云势不可挡,传令一定要活捉。赵云利用这个机会冲出包围,连杀50员曹将,终于将阿斗交给了刘备。

赵云单骑救主的故事广为流传。话说赵云有一招绝技,没有人能够在绝技下幸存。赵云救到刘禅后,要突出重围。已知赵云一共遇到了n名敌人,每个敌人有一个攻击力,每个敌人的攻击力各不相同,且最大为n。为了减轻自己的压力,赵云每次会选择当前幸存的攻击力最大的敌人并将其杀死。n名敌人会依次过来增援,一次来一个,并且都围在赵云周围(即来了之后赵云都可以攻击到),现在给出敌人的增援序列和赵云使用绝技的时间,请依次给出死亡敌人的攻击力。

Input

第一个整数为case(case<=10)数。对于每个case,一定以整数n(n<=100000)开头,表示对应的敌人总数。下一行n个整数依次表示增援敌人的攻击力。下一行一个整数,表示赵云使用绝技的次数q(q<=n),接下来一行q个整数(由小到大),qi表示赵云在第qi个敌人来了之后使用了一次绝技。

Output

依次输出死亡敌人的攻击力,每两个整数之间一个空格,每个case结尾有个换行。

Sample Input

2
5
1 2 3 4 5
2
2 5
4
1 2 3 4
1
4
Sample Output

2 5
4
# include<stdio.h>
# include<string.h>

int heap[100001],b[100001],all=0;

void insert(int x)
{
heap[all] = x;
all++;
int s,p = all-1,t;
while(p>0)
{
s = (p-1)/2;
if(heap[s]<heap[p])
{
t = heap[s];
heap[s] = heap[p];
heap[p] = t;
p = s;
}
else break;
}
}

void del()
{
heap[0] = heap[all-1];
all--;
int i,s=0,t;
for(i=1;i<all;i=2*s+1)
{
if(heap[i]<heap[i+1] && i+1<all) i++;
if(heap[s]>=heap[i]) break;
t = heap[s];
heap[s] = heap[i];
heap[i] = t;
s = i;
}
}

int main()
{
int n,i,t,x,q,j;
scanf("%d",&t);
while(t--)
{
all = 0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
scanf("%d",&q);
for(i=1,j=0;i<=q;i++)
{
scanf("%d",&x);
while(j<x)
{
insert(b[j]);
j++;
}
printf("%d",heap[0]);
if(j<n)printf(" ");
del();
}
printf("\n");
}
return 0;
}
...全文
42 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧