vector总结(带你学好vector)二

讲完知识,看例题

猴子选大王

题目描述

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入格式

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

0 0

输出格式

对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

输入输出样例

输入样例1:
6 2 12 4 8 3 0 0
输出样例1:
5 1 7
#include<bits/stdc++.h>
using namespace std;
vector <int>v;
int main(){
	int n,m;
	while(cin>>n>>m&&n&&m){
		int ans=0;
		for(int i=1;i<=n;i++) v.push_back(i);
		int del=(m-1)%n;
		for(int i=1;i<n;i++){
			v.erase(v.begin()+del);
			del=(del+m-1) %v.size();
		}
		cout<<v[0]<<endl;
		v.clear();
	}
	return 0;
}

排队看病

题目描述

大家都知道去医院看病是需要排队的,不过科丁博士观察发现医院里排队还是有讲究的。科丁博士去的医院一共只有三个医生同时看病,而看病的人病情有轻重,所以不能根据简单的先来先看的原则。因此,医院对病情定了10种不同的优先级,优先级最高位10级,最低为1级,医生在看病时,则会在他的队伍里面选择一个优先级最高的人进行诊治。如果遇到两个优先级一样的病人,则选择最早来排队的病人。

现在科丁博士想请你帮助看一下医生看病时看的病人的编号是多少。

输入格式

输入数据包含多组测试,对于每组测试数据:

第一行有一个正整数N(0<N<2000)表示事件的数目。

接下来N行,分别描述一个事件,事件一共分为两种:

1:"IN A B",表示有优先级B的病人要求医生A诊治。(0<A<=3,0<B<=10)

2:"OUT A",表示医生A进行了一次诊治,诊治完毕后,病人出院。(0<A<=3)

输出格式

对于每个"OUT A"事件,请输出被诊治的病人的编号ID。如果队伍中无病人需要诊治,则输出"EMPTY"。

病人的编号定义为:在一组测试数据中,"IN A B"事件发生第K次时,进来的病人编号即为K,编号是从1开始的。

输入输出样例

输入样例1:
7 IN 1 1 IN 1 2 OUT 1 OUT 2 IN 2 1 OUT 2 OUT 1 2 IN 1 1 OUT 1
输出样例1:
2 EMPTY 3 1 1

【耗时限制】1000ms 【内存限制】32MB

#include<bits/stdc++.h>
using namespace std;
struct stu{
	int id,pri;
}t;
int n,did,pid;//事件数量 医生编号 优先级 
string cmd;
bool cmp(const stu &x,const stu &y){
	if(x.pri!=y.pri) return x.pri>y.pri;
	return x.id<y.id;
}
int main(){
	while(cin>>n){
    	vector<stu>doc[4];
    	int k=1;
    	for(int i=1;i<=n;i++){
    		cin>>cmd;
    		if(cmd=="IN"){
    			cin>>did>>pid;
    			t.id=k++;
    			t.pri=pid;
    			doc[did].push_back(t);
    		}
    		else if(cmd=="OUT"){
    			cin>>did;
    			if(!doc[did].empty()){
    				sort(doc[did].begin(),doc[did].end(),cmp);
    				cout<<doc[did][0].id;
    				doc[did].erase(doc[did].begin());
    			}
    			else cout<<"EMPTY";
    			cout<<endl;
    		}
    	}
	}
	return 0;
}

 

维护序列

题目描述

给定一个长度为n的整数序列。现在有m个操作,操作分为三类,格式如下:

   ① 1 i:询问序列中第i个元素的值,保证i小于等于当前序列长度;

   ② 2 i v:在序列中第i个元素前加入新的元素v,保证i小于等于当前序列长度;

   ③ 3 i:删除序列中的第i个元素,保证i小于等于当前序列长度。

输入格式

第一行输入n(1<=n<=1000),表示序列最初的长度。

第二行输入n个空格隔开的数表示原始的整数序列。

第三行输入m(1<=m<=1000),表示操作数。

第四到m+3行依次输入一个操作。

输出格式

对于操作①输出对应的答案,一行输出一个数。

输入输出样例

输入样例1:
5 6 31 23 14 5 5 1 2 2 2 7 1 2 3 3 1 3 
输出样例1:
31 7 23 

说明

1<=n<=1000, 1<=m<=1000,每个元素都是不超过1000000的正整数。

【耗时限制】1000ms 【内存限制】256MB

#include<bits/stdc++.h>
using namespace std;
vector <int> v;
int main(){
	int n,a;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a;
		v.push_back(a);
	}
	int m,cmd,p,id;
	cin>>m;
	while(m--){
		cin>>cmd>>id;
		if (cmd==1) cout<<v[id-1]<<endl;
		else if(cmd==2){
			cin>>p;
			v.insert(v.begin()+id-1,p);
		}
		else if(cmd==3){
			v.erase(v.begin()+id-1);
		}
	}
	return 0;
}

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值