讲完知识,看例题
猴子选大王
题目描述
约瑟夫问题:有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; }