1. 银行取款
【题目描述】
在现代文明社会中,大家在诸如银行办理业务、车站买票等活动时都很文明没有插队的现象,本着“先来先服务”的规矩。
新年马上到了,明明的爸爸打算上银行去取点钱,带着一向表现很好的明明同学到三亚旅游,明明的爸爸到银行时发现很多人在办理业务,明明的爸爸就自觉地在排队机上去了一个业务号码,并焦急的等待着银行柜台叫自己的号码......
【输入文件】
输入文件名:bank.in
输入中包含I(表示等待办理业务)和顾客的序号,或者 O(表示办理完业务的人离开);
输入数据不超过100行。
【输出文件】
输出文件名:bank.out
输出银行排队中出队顾客序列,若队列为空(没人等待),则输出“None”
【样例输入】
O
I 1
I 2
O
I 3
O
O
O
【样例输出】
None
1
2
3
None
#include <iostream> using namespace std; int main(){ int q[101]={}; int head ,tail; head = tail = 0; char ch; while(cin >> ch){ if(ch == 'O'){ if (head >= tail) cout<<"None"<<endl; else { cout<<q[head]<<endl; head++; } } if(ch == 'I'){ tail++; cin >> q[tail]; } } return 0; }
2.选小寿星
【问题描述】
五年级一班有一个传统,全班一起庆祝当月过生日的同学。有m名学生都是11月份过生日,班主任决定挑一名学生作为寿星代表切蛋糕。班主任将过生日的m名学 生随机围成一个圈,从1到m进行编号。随机挑一个数字n(1<=n<=9),从第一个同学开始连续报数,报数到n的同学就出局,然后从下一位 同学重新开始报数,一直到剩下最后一名同学。由于女生少,班主任决定每个女生有2次机会,也就是说,每名女生第2次数到n时才出局。
例如,m=3,其中有1名女生,编号顺序为1,2,3,分别是男,女,男,n=2。第一轮报数,报到的是2号女生,暂不出局(注:女生有2次机会)。第二轮报数, 3号男生报1,1号男生报2出局。第三轮报数,2号女生报1,3号男生报2出局,最后留下2号女生。 有m=5,其中2名女生,编号顺序为1,2,3,4,5,分别为男,男,女,女,男。n=3。挑选后的结果是5号,男生。(注:女生有2次机会)
【输入文件】 文件名:choice.in
文件中第一行输入数字为m,表示有m个人,m<20; 第二行是m个整数,1代表男生,0代表女生。 第三行是n,表示n是出局数字。(注意:女生有2次机会)
【输出文件】 文件名:choice.out 输出留下学生的序号。
【样例输入】
5
1 1 0 0 1
3
【样例输出】
5
#include <iostream> using namespace std; int main(){ int a[101]; int n,m,t; cin >> n; int count = n; int s = 0; for(int i = 0;i <n;i++){ cin >> t; if(t == 1){ a[i] = 1; }else{ a[i] = 2; } } cin >> m; int i = 0; while(count > 1){ if(a[i] >0){ s++; } if(s == m){ a[i]--; if(a[i] == 0){ count--; } s = 0; } i++; i%=n; } for(i = 0;i <n;i++){ if(a[i]){ cout << i + 1<< endl; } } return 0; }
1.Blash数集
【题目描述】
大数学家高斯小时候偶然间发现一种有趣的自然数集合Blash,对应以a为基的集合Ba定义如下:
(1)a是集合Ba的基,且a是Ba的第一个元素;
(2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;
(3)没有其他元素在集合Ba中了。
现在小高斯想知道如果将集合Ba中元素按照升序排列,第n个元素会是多少?
【输入格式】输入包含很多行,每行输入包括两个数字,集合的基a(1<=a<=50)以及所求元素序号n(1<=n<=1000000)。
【输出格式】对应每个输入,输出集合Ba的第n个元素值。
【样例输入】
1 100
28 5437
【样例输出】
418
900585
#include<iostream> using namespace std; const int N = 1000000; int a,n,q[N]; void blash(int a,int n) { q[1] = a; int tail = 1,head2,head3; head2 = head3 = 1; while(tail <= n) { long long x = 2*q[head2]+1; long long y = 3*q[head3]+1; if(x < y) { q[++tail] = x; head2++; } else { if(x > y) { q[++tail] = y; head3++; } else { q[++tail] = x; head2++; head3++; } } } cout << q[n] << endl; } int main() { while(cin >> a >> n) { blash(a,n); } return 0; }
2.移动的小球
【问题描述】
你有一些小球,从左到右依次编号为1,2,3,…,n,你可以执行两种指令。其中A X Y表示把小球X移动到小球Y左边,B X Y表示把小球X移动到小球Y右边。指令保证合法,即X不等于Y。
输入:小球个数n。指令条数m和m条指令,注意,1≤n≤500000,0≤m≤100000。
输出: 从左到右输出最后的小球序列。
【样例输入】
6 2
A 1 4
B 3 5
【样例输出】
2 1 4 5 3 6
#include <iostream> using namespace std; const int N = 500001; int n,A[N]; int find(int X) { for(int i = 1; i <= n; i++) if(A[i] == X) return i; return 0; } void left(int a, int b) { int t = A[a-1]; for(int i = a; i <= b; i++) { A[i-1] = A[i]; } A[b] = t; } void right(int a, int b) { int t = A[a]; for(int i = a; i >= b; i--) { A[i+1] = A[i]; } A[b] = t; } int main() { int m, X, Y, p, q; char type; cin >> n >> m; for(int i = 1; i <= n; i++) A[i] = i; for(int i = 1; i <= m; i++) { cin >> type >> X >> Y; p = find(X); q = find(Y); if(type == 'A') { if(q > p) left(p+1, q-1); else right(p-1, q); } else { if(q > p) left(p+1, q); else right(p-1, q+1); } } for(int i = 1; i <= n; i++) { cout << A[i] << " "; } cout << endl; return 0; }