插队2

插队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;      
}      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值