插队2
★实验任务
春节到了,大家急着排队买车票,但是有些人却喜欢插队,如果有人插队,
排在其后面的人就会愤怒而获得一个愤怒值,当队列中所有人的愤怒值之和超过
一定的限值,队列中的人就会将所有插队的人踢出队列,之和所有人的愤怒值清
0。每个人的初始愤怒值为0,插队的人被插队后也会增加愤怒值。
★数据输入
第一行有两个整数N 和M,代表有N 个操作和队列的愤怒限值。(1<=N <=
1000,0<=M<=1000000)
接下来N 行,每行一个操作。
第i 行的操作有两种格式。(i 的值从一开始)
0 表示编号为i 的人插入到排队队列的末尾。
1 x y 表示编号为i 的人插队到编号为x 的人的前面,在其后面的人的愤怒值增
加y。
★数据输出
输出两行,第一行按顺序输出队列中的人的编号。
第二行为当前队列中所有人的愤怒值之和。
- 输入示例
5 3
0
0
1 1 2
1 2 2
0 - 输出示例
1 4 2 5
2
Hint:
1 进入队列末尾,2 进入队列末尾。3 插队到1 前面,1 和2 的愤怒值均增加2,队列的总愤
怒值为4,超过m,3 被踢出队伍。4 插入到2 前面,2 的愤怒值增加2,队列的总愤怒值为
2。5 进入队列末尾。
代码:
#include<stdio.h>
#include<malloc.h>
typedef struct queue{
long num,argue;
bool qq;
struct queue* next;
}que;
que *head=NULL,*p1,*p2;
int n,a,i,s=0,b,m,ok=0;
int main()
{
void insert(int a,int i);
void del();
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{ok=0;
scanf("%d",&a);
if(a==0){
if(head==NULL){
head=p1=p2=(que*)malloc(sizeof(que));
head->num=i;head->qq=false;head->argue=0;head->next=NULL;
}
else{
p2=(que*)malloc(sizeof(que));
p2->num=i;p2->qq=false;p2->argue=0;
p2->next=NULL;
p1->next=p2;
p1=p2;
}
}
else{
scanf("%d%d",&a,&b);
insert(a,i);
que *p;
for(p=head;p;p=p->next)
{s+=p->argue;}
if(s>m)
ok=1;
s=0;
}
if(ok)
del();
}
que *p;
for(p=head;p->next!=NULL;p=p->next)
{printf("%d ",p->num);s+=p->argue;}s+=p->argue;
printf("%d\n%d\n",p->num,s);
return 0;
}
void insert(int a,int i)
{
que *p,*p0,*q;
p0=(que*)malloc(sizeof(que));
p0->num=i;p0->qq=true;p0->argue=0;
if(head->num==a)
{
p0->next=head;
head=p0;
for(p=head->next;p;p=p->next)
p->argue+=b;
}
else
{
for(q=p=head;p;q=p,p=p->next)
if(p->num==a)
break;
q->next=p0;p0->next=p;
for(;p;p=p->next)
p->argue+=b;
}
}
void del()
{
que *p,*q=head;
p=head;
while(head->qq==true)
{
head=p->next;p=head;q=p;
}
for(p=head->next;p;q=p,p=p->next)
{
if(p->qq==true)
{q->next=p->next;free(p);p=q;}
}
for(p=head;p;p=p->next)
p->argue=0;
s=0;
}