插队 2
来源:互联网 发布:淘宝子账号运营权限 编辑:程序博客网 时间:2024/04/29 00:35
实验任务
春节到了,大家急着排队买车票,但是有些人却喜欢插队,如果有人插队,排在其后面的人就会愤怒而获得一个愤怒值,当队列中所有人的愤怒值之和超过一定的限值,队列中的人就会将所有插队的人踢出队列,之和所有人的愤怒值清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
解题思路
用vector模拟,具体见注释。
参考代码
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef vector<int>::iterator ITER; int main() { int n,i,j,d,opr,angry,v; while (~scanf("%d %d",&n,&angry)){ vector<int> num,que; __int64 cnt = 0;//记录当前队伍的愤怒值 for (i = 1;i <= n;i++){ scanf("%d",&opr); if (opr == 0){ num.push_back(i); //num是拿来操作的队伍 que.push_back(i); //que是当做备份用的 }else if (opr == 1){ scanf("%d %d",&d,&v); ITER iter = find(num.begin(),num.end(),d);//找到被插入的位置 num.insert(iter,i); //在这个位置插入 int len = num.size(); for (j = 0;j < len;j++){//遍历队伍 if (num[j] == d){ cnt += (len-j)*v;//在插入的人后面有(len-j)个人,则愤怒值增加(len-j)*v break; } } if (cnt > angry){//愤怒值超过上限 num = que; //因为que里的人都是正常入队(即没插队),把que赋给num,就是把插队的人踢出 cnt = 0; //愤怒值清零 } } } ITER it = num.begin(); for (;it != num.end()-1;it++) printf("%d ",*it); printf("%d\n%d\n",*it,cnt); } return 0; }
0 0
- 插队 2
- 插队2
- 插队
- 插队,又是插队!
- 1371 插队
- 二分法插队
- POJ2828 插队
- 线程插队
- poj 2828 插队买票
- UVa540插队问题
- poj 2828 插队买票
- C 语言程序设计实践 9.7 插队
- 单点更新倒序插队问题
- 朱敏:从插队知青到硅谷英雄
- 朱敏:从插队知青到硅谷英雄
- 男子到银行打劫 营业员:别插队!
- POJ2828线段树 插队(单点更新)
- poj2828(线段树解插队问题)
- SpringMVC整合Velocity模版引擎
- 函数参数与函数调用(彻底理解值传递与引用传递)
- lumia 更新到 windows 10 之后的一些问题及解决办法
- spring入门——spring in action学习p1-p50
- 已知前序和中序、后序和中序建立二叉树
- 插队 2
- 全方位找工作之后
- 几种查看当前程序内存的方式
- Css实例
- 黑马程序员———OC学习第三天(@property和@synthesize关键字)
- 4.12
- 二叉树前中后序遍历的递归版本和非递归版本、队列实现的层次遍历
- 剑指offer--和为S的连续正数序列
- Java7之线程池ForkJoinPool