问题 A: 分离出整数n从右边数第k个数字,递归实现
题目描述
在程序中定义一函数digit(n,k),它能分离出整数n从右边数第k个数字。
输入
正整数n和k。
输出
第k个数字(若不存在则输出0)
样例输入
31859 3
样例输出
8
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int digit(int n,int k){
if(k==1) return n%10;
else return digit(n/10,k-1);
}
int main()
{
int n,k;cin>>n>>k;
cout<<digit(n,k);
return 0;
}
问题 B: Xu Xiake in Henan Province
题目描述
少林寺是中国佛教禅宗祖庭,坐落于河南省登封市。少林寺始建于公元5世纪,至今仍是少林佛教的主要寺庙。
龙门石窟是中国佛教艺术最好的代表之一。这些佛像位于今天的河南省洛阳市以南12km 处,里面有数以万计的佛陀和其弟子的雕像。
根据历史记载,白马寺是中国第一座佛教寺庙,由汉朝皇帝发起建于公元68年,坐落于东汉首都洛阳。
云台山位于河南省焦作市修武县。云台地质公园景区被国家旅游局列为AAAAA 级风景区。云台瀑布位于云台地质公园内,瀑布高 314m,号称是中国最高的瀑布。
它们是河南省最著名的地方景点。
现在是时候判断一下旅行者的水平了。所有旅行者都可以根据他们所到过的景点的数量来分类。
一个旅行者游览了上述提到的0个景点,那么他就是“Typically Otaku”。
一个旅行者游览了上述提到的1个景点,那么他就是“Eye-opener”。
一个旅行者游览了上述提到的2个景点,那么他就是“Young Traveller”。
一个旅行者游览了上述提到的3个景点,那么他就是“Excellent Traveller”。
一个旅行者游览了上述提到的4个景点,那么他就是“Contemporary Xu Xiake”。
请确认旅行者的水平。
输入
输入包含多组测试样例,第一行包含一个正整数,表示最多个测试样例的数量。
对于每个测试案例,唯一的一行包含4个整数、、和,其中是旅行者游览第i个景点的次数,0≤、、、≤100。
如果是0,那就意味着旅行者从来没有去过第i个景点。
输出
对于每个测试样例,输出一行,其中包含一个字符串,表示旅行者的分类,该字符串应该是
“Typically Otaku”,“Eye-opener”,“Young Traveller”,“Excellent Traveller”,“Contemporary Xu Xiake” 其中之一。
样例输入
5
0 0 0 0
0 0 0 1
1 1 0 0
2 1 1 0
1 2 3 4
样例输出
Typically Otaku
Eye-opener
Young Traveller
Excellent Traveller
Contemporary Xu Xiake
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int t;cin>>t;
while(t--){
int a,b,c,d,cnt=0;
cin>>a>>b>>c>>d;
if(a!=0) cnt++;
if(b!=0) cnt++;
if(c!=0) cnt++;
if(d!=0) cnt++;
switch(cnt){
case 1:cout<<"Eye-opener"<<endl;break;
case 2:cout<<"Young Traveller"<<endl;break;
case 3:cout<<"Excellent Traveller"<<endl;break;
case 4:cout<<"Contemporary Xu Xiake"<<endl;break;
default:cout<<"Typically Otaku"<<endl;;
}
}
return 0;
}
问题 C: Fibonacci Sequence
题目描述
斐波那契数列,又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。
在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
斐波那契数列定义如下:F1=1,F2=1,F3=2,F4=3,…………,Fn=Fn-1+Fn-2(n>2)
编写程序,输出斐波那契数列第n个数字
输入
一个正整数n(1\leq n\leq901≤n≤90 )
输出
一个正整数 输出斐波那契数列第n个数字
样例输入
1
样例输出
1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
LL f[100];
f[1]=1;
f[2]=1;
for(int i=3;i<=90;i++) f[i]=f[i-1]+f[i-2];
int n;cin>>n;
cout<<f[n];
return 0;
}
问题 D: 一只小蜜蜂
题目描述
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示(题里没图我找了一个)
输入
输入数据的第一行是一个整数N,表示测试实例的个数。
然后是N 行数据,每行包含两个整数a和b 。
输出
对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。
样例输入
2
1 2
3 6
样例输出
1
3
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int dp[100];//表示从1到n的路径
void DP(){
dp[1]=0;
dp[2]=1;
dp[3]=2;
for(int i=4;i<=50;i++) dp[i]=dp[i-1]+dp[i-2];
}
int main()
{
int t;cin>>t;
DP();
while(t--){
int x,y;
cin>>x>>y;
y -= (x-1);
cout<<dp[y]<<endl;
}
return 0;
}
问题 E: 【蓝桥杯2020初赛】七段码
题目描述
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有7 段可以发光的二极管,分别标记为a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
输入
无
输出
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
思路:数据不大,直接肉眼数更快
#include<bits/stdc++.h>
using namespace std;
const int N = 8;
bool use[N];
int ans, e[N][N], fa[N];
int find(int u){
if(fa[u] == u) return u;
fa[u] = find(fa[u]);
return fa[u];
}
void dfs(int d){
if(d > 7){
for(int i = 1;i <= 7;i++)fa[i] = i;
for(int i = 1;i <= 7;i++)
for(int j = 1;j <= 7;j++)
if(e[i][j] && use[i] && use[j]){
int fx = find(i),fy = find(j);
if(fx != fy)fa[fx] = fy;
}
int k = 0;
for(int i = 1;i <= 7;i++)
if(use[i] && fa[i]==i) k++;
if(k == 1) ans++;
return;
}
use[d] = true;
dfs(d + 1);
use[d] = false;
dfs(d + 1);
}
int main(){
/* a b c d e f g
1 2 3 4 5 6 7 */
e[1][2] = e[1][6] = 1;
e[2][1] = e[2][7] = e[2][3] = 1;
e[3][2] = e[3][4] = e[3][7] = 1;
e[4][3] = e[4][5] = 1;
e[5][4] = e[5][6] = e[5][7] = 1;
e[6][1] = e[6][5] = e[6][7] = 1;
e[7][2] = e[7][3] = e[7][5] = e[7][6] = 1;
dfs(1);
cout << ans;
}
问题 F: 【蓝桥杯2020初赛】平面切分
题目描述
平面上有N 条直线,其中第i 条直线是y = Ai * x + Bi。
请计算这些直线将平面分成了几个部分。
输入
第一行包含一个整数N。
以下N 行,每行包含两个整数Ai, Bi。
对于50% 的评测用例,1 ≤ N ≤ 4, -10 ≤ Ai, Bi ≤ 10。
对于所有评测用例,1 ≤ N ≤ 1000, -100000 ≤ Ai, Bi ≤ 100000。
输出
一个整数代表答案。
样例输入
3
1 1
2 2
3 3
样例输出
6
思路:边一条一条加入,总面数为 加入的新边与老边的交点数加一
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<double,double> pdd;
double a[1010][2];
LL cnt=1;//初始有一个面
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++){
cin>>a[i][0]>>a[i][1];
set<pdd> dot;//集合里不会有重复的点
int flag=1;
pdd b;
for(int j=0;j<i;j++){
if(a[i][0]==a[j][0]){
if(a[i][1]==a[j][1]){
flag=0;
break;
}else continue;
}
//ax+b=cx+d
//x=(d-b)/(a-c)
b.first = (a[j][1]-a[i][1])/(a[i][0]-a[j][0]);
b.second = a[i][0]*b.first+a[i][1];
dot.insert(b);
}
if(flag) cnt += dot.size()+1;
}
cout<<cnt;
return 0;
}
问题 G: 回到学校
题目描述
愉快的假期总是那么的短暂。
回到学校后,小T监测了教室的进出情况。
假设班级里有 N个同学,学号分别是 1 ∼ N,小T记录了每位同学分别是第几个进入的教室。
你可以通过上述记录,按进入教室的先后顺序输出同学的学号吗?
输入
N
A1 A2 … AN
第一行一个正整数 N,代表同学的个数。
第二行有空格隔开的 N个正整数,Ai代表学号为 i 的同学是第几个进入教室的。
数据范围:
1 ≤ N ≤ 10e5 1 ≤ A i ≤ N
A i ≠ A j ( i ≠ j )
输出
输出一行一个正整数,第 i ii 个整数代表第 i ii 个进入教室的同学的学号。
样例输入
3
2 3 1
样例输出
3 1 2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
int main()
{
int n;cin>>n;
vector<pii> v;
for(int i=1;i<=n;i++){
int x;cin>>x;
v.push_back({x,i});
}
sort(v.begin(),v.end());
vector<pii>::iterator it;
for(it=v.begin();it!=v.end();it++){
pii t=*it;
cout<<t.second<<" ";
}
return 0;
}
问题 H: 九九乘法表(教师版)
题目描述
你是XSY的老师,XSY只学过九九乘法表,你看到他的作业中出现了一个数。
如果这个数在九九乘法表是找不到的,那么他肯定答错了,就输出"No"(不含引号),否则,就输出"Yes"(不含引号)
输入
一个整数
代表XSY的答案。
输出
输出 Yes 或 No
样例输入
10
样例输出
Yes
输入样例2
11
输出样例2
No
样例1解释:因为“二五一十”,可以算出10这个数
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
vector<int> v;
void cheng(){
for(int i=1;i<=9;i++){
for(int j=i;j<=9;j++){
v.push_back(i*j);
}
}
}
int main()
{
int n;cin>>n;
cheng();
vector<int>::iterator it=find(v.begin(),v.end(),n);
if(it!=v.end()) cout<<"Yes";
else cout<<"No";
return 0;
}
问题 I: 逃命双曲线
题目描述
在平面直角坐标系上,你初始在点(1,1),你每秒可以向 x轴正方向移动恰好一个单位,或向 y轴正方向移动恰好一个单位。你只能停留在坐标均为整数的点上.
你的目标是逃到双曲线 y=k/x上,并且能够停留,请问你至少需要多少时间?
输入
输入一个整数
输出
输出一个整数,求最短时间
样例输入
10
样例输出
5
提示
样例解释:你的路线可以是
花费5秒
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0xcfffffffff
//开始的时候竟然INF设小了
int main()
{
LL k;cin>>k;
LL m=INF;
for(LL i=1;i<=sqrt(k);i++){
if(k%i==0){
m = (LL)min((LL)m,(LL)k/i+i);
}
}
cout<<m-2;
return 0;
}
问题 J: Dongdziz与300刀1刀999
题目描述
Dongdziz哥哥的STEAM库里面有很多游戏,其中有一个他花300刀从来没玩过的游戏,叫作《重生之我是特朗普》。今天dongdziz哥心情很好于是想玩一下这个游戏然后他就点开了这个游戏,发现这个游戏一开始会给你一排装备,装备的等级从A-Z。
然后系统会自动生成一个数字,给这些原始装备的等级都+N,比如N=2,那么A->C,但是很奇怪如果是顶级的Z装备 +2之后就变成了B.居然从最垃圾的装备到最顶级的装备开始循环了,dongdziz看傻了,请你告诉dongdziz哥,这些装备的等级+N之后会变成啥等级
助力他统一美利坚帝国,一刀999
输入
0<=N<=26
1<=S<=1e4(S中都是大写字母)
输出
升级后的装备
一个字符串
代表从排头到排尾的装备等级
样例输入
2
ABCXYZ
样例输出
CDEZAB
ssn:也不知道 天天的 这些有意思的题干是谁编出来的
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0xcffffff
int main()
{
int n;cin>>n;
string s;cin>>s;
int key[s.length()];
for(int i=0;i<s.length();i++){
key[i]=(s[i]-'A'+n)%26;
cout<<char(key[i]+'A');
}
return 0;
}
问题 K: Bob和Alice(4)
题目描述
Bob和Alice又在玩一个新的序列游戏:有一个1到n的随机排列P1,P2 … Pn
Bob又定义了一个新的序列M1 M2 … Mn
Mi = i % Pi
求M1+M2+… +Mn可能的最大值
输入
n
1 <= n <= 109
输出
求M1 + M2 + … + Mn可能的最大值
样例输入
2
样例输出
1
提示
{P1,P2} = {2,1} , M1+M2= 1 + 0 = 1
思路:
(序列 是指 1~n这n个数不重不漏)
田忌赛马策略,把n%1,1~n-1求和
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0xcffffff
int main()
{
int n;cin>>n;
cout<<(LL)n*(n-1)/2;
return 0;
}
问题 L: Bob和Alice(5)
样例输入
3 2 3 1
样例输出
5
已经很努力的在想了,不知道要怎么优化(/泪)下面是超时代码。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0xcffffff
int p[100010];
int q[100010];
LL quicksort(int l,int r,int k)
{
if(l>=r) return q[l];
int x=q[l],i=l-1,j=r+1;
while(i<j){
while(q[++i]<x);
while(q[--j]>x);
if(i<j) swap(q[i],q[j]);
}
int s=j-l+1;
if(k<=s) return quicksort(l,j,k);
else return quicksort(j+1,r,k-s);
}
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
LL sum=0;
for(int l=1;l<=n-1;l++){
LL max2=0;
for(int r=l+1;r<=n;r++){
if(max2>p[r]) sum += max2;
else{
for(int i=l;i<=r;i++) q[i]=p[i];
max2 = quicksort(l,r,r-l);
sum += max2;
}
}
}
printf("%lld",sum);
return 0;
}