蓝桥杯
C语言网中的蓝桥VIP
一. 问题 1655: [蓝桥杯]筛选号码
原题链接
题目描述
有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。
问最后留下的是原来第几号的那位。 举个例子,8个人围成一圈: 1 2 3 4 5 6 7 8 第1次报数之后,3退出,剩下:1 2 4 5 6 7 8
(现在从4开始报数) 第2次报数之后,6退出,剩下: 1 2 4 5 7 8
(现在从7开始报数) 第3次报数之后,1退出,剩下: 2 4 5 7 8
(现在从2开始报数) 第4次报数之后,5退出,剩下: 2 4 7 8
(现在从7开始报数) 第5次报数之后,2退出,剩下: 4 7 8
(现在从4开始报数)第6次报数之后,8退出,剩下: 4 7
(现在从4开始报数) 最后一次报数之后,4退出,剩下:7.
所以,最后留下来的人编号是7。
数据规模和约定
对于100%的数据,1< n< 10000。
输入
一个正整数n,(1< n< 10000)
输出
一个正整数,最后留下来的那个人的编号。
样例输入
8
样例输出
7
代码如下
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; queue<int> q; for(int i=1;i<=n;i++){ q.push(i); } int cnt = 0; while(q.size()>2){ cnt ++; if(cnt==3){ q.pop(); cnt = 0; }else{ q.push(q.front()); q.pop(); } } cout << q.back(); }
大佬的递归写法:
#include <bits/stdc++.h> using namespace std; int Joseph(int sum,int cnt,int n) //总人数sum,数到cnt出圈,存活人数n { return n==1 ? (sum+cnt-1)%sum : (Joseph(sum-1,cnt,n-1)+cnt)%sum; } int main() { int n; cin >> n; cout << Joseph(n,3,n)+1; }
二. 问题 1638: [蓝桥杯][算法训练VIP]新生舞会
题目描述
新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。给出m对两人的信息(姓名或学号),判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。
输入
第一行一个整数n(2< =n< =1000),表示学生人数。接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。 之后的一行是一个整数m(1< =m< =1000),表示询问的数目。接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,中间用一个空格隔开。
输出
对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,否则输出一个大写字母‘N’。
样例输入
4 John 10 M Jack 11 M Kate 20 F Jim 21 M 3 John 11 20 Jack Jim Jack
样例输出
N Y N
代码如下
#include <bits/stdc++.h> using namespace std; struct student{ string name,num; char sex; }; struct test{ string info1,info2; char YorN; }; int main() { vector<student> v; vector<test> v2; int n; cin >> n; for(int i=0;i<n;i++){ student t; cin >> t.name >> t.num >> t.sex; v.push_back(t); } int m; cin >> m; for(int i=0;i<m;i++){ test t; cin >> t.info1 >> t.info2; v2.push_back(t); } for(int j=0;j<m;j++){ for(int i=0;i<n;i++){ if(v[i].name==v2[j].info1||v[i].num==v2[j].info1){ for(int k=0;k<n;k++){ if(v[k].name==v2[j].info2||v[k].num==v2[j].info2){ if(v[i].sex!=v[k].sex){ v2[j].YorN = 'Y'; }else{ v2[j].YorN = 'N'; } } } } } } for(int i=0;i<m;i++){ cout << v2[i].YorN << endl; } }
- 点赞
- 收藏
- 分享
- 文章举报
- 蓝桥杯 c++ 罗马数字转换问题
- 蓝桥杯-练习题(1017-1030)
- 【第四届蓝桥杯】核桃的数量
- [蓝桥杯单片机开发设计]nuist_Ydrsmart学习心得-Day1
- 蓝桥杯基础练习 字母图形
- 第六届蓝桥杯【省赛试题9】垒骰子 ( 矩阵快速幂 )
- [置顶] 2012第三届--2017第八届 蓝桥杯省赛-C/C++真题汇总
- [蓝桥杯][2017年第八届真题]小计算器 (java),官网测试只有三十分,待修改
- 第五届蓝桥杯—— 基础练习:数列特征
- 蓝桥杯 入门训练 序列求和 (c语言)
- 蓝桥杯算法训练:递归求二项式系数值
- 蓝桥杯 马虎的算式(暴力五重循环)
- 蓝桥杯 历届试题 带分数(搜索)
- 蓝桥杯 2的次幂表示 解题报告(递归)
- [蓝桥杯]十六进制转八进制
- 蓝桥杯算法训练-筛选号码问题(Java语言)
- “蓝桥杯”历届试题:翻硬币
- 蓝桥杯校内选拔第六题
- 刷题蓝桥杯(java)---2N皇后
- 素因子去重(蓝桥杯练习题)