您的位置:首页 > 其它

蓝桥杯

2020-02-03 04:23 176 查看

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;
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
绀香零八 发布了32 篇原创文章 · 获赞 10 · 访问量 940 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: