在线笔试—赛码⽹试题(⼀)
1、跳台阶
有⼀楼梯共m级,刚开始时你在第⼀级,若每次只能跨上⼀级或⼆级,要⾛上第m级,共有多少⾛法?
注:规定从⼀级到⼀级有0种⾛法。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int k;
cin >> k;
int n;
while(k--)>0) {
cin >> n;
if(n==1) {
cout << 0 << endl;
continue;
}
vector<int> steps(n,1);
for(int i=2;i<n;i++) {
steps[i] = steps[i-1] + steps[i-2];
}
cout << steps[n-1] << endl;
}
}
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[41]={0};
a[1]=1;
a[2]=1;
for(int i=3;i<=40;i++)
a[i]=a[i-1]+a[i-2];
while(n--)
{
int num;
cin>>num;
cout<<a[num]<<endl;
}
}
2、击⿎传花
聪明的⼩赛提出⼀个有趣的问题:有多少种不同的⽅法可以使得从⼩赛⼿⾥开始传的花,传了m次以后,
⼜回到⼩赛⼿⾥。对于传递的⽅法当且仅当这两种⽅法中,接到花的同学按接球顺序组成的序列是不同的,才视作两种传花的⽅法不同。⽐如有3个同学1号、2号、3号,并假设⼩赛为1号,花传了3次回到⼩赛⼿⾥的⽅式有1->2->3->1和1->3->2->1,共2种。
输⼊:输⼊共⼀⾏,有两个⽤空格隔开的整数n,m(3<=n<=30,1<=m<=30)
输出:输出共⼀⾏,有⼀个整数,表⽰符合题意的⽅法数
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
ios 字符串转数组vector<vector<int> > A(2, vector<int>(n));
A[0][0] = 1;
for (int i = 1; i < n; i++)
A[0][i] = 0;
int p = 1;
for (int i = 1; i <= m; i++,p=1-p)
{
for (int j = 0; j < n; j++)
{
A[p][j] = A[1 - p][(j - 1 + n) % n] + A[1 - p][(j + 1) % n];//DP的递推⽅程
}
}
cout << A[1-p][0] << endl;
return0;
}
3、股神
经过严密的计算,⼩赛买了⼀⽀股票,他知道从他买股票的那天开始,股票会有以下变化:第⼀天不变,以后涨⼀天,跌⼀天,涨两天,跌⼀天,涨三天,跌⼀天...依此类推。
为⽅便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?
#include <iostream>
using namespace std;
int GetValue(int n)
{
int i = 0;// i统计遇到了多少次下跌
int j = 2;// 每次下跌之后上涨的天数,包含已经下跌的那天
int k = n;
while (k > j) {
i += 2;
k -= j;
++j;
}
return n - i;
}
int main()
{
int n;
while (cin >> n) {
cout << GetValue(n) << endl;
}
return0;
}
4、约德尔测试
说起约德尔⼈的未来,⿊默丁格曾经提出了⼀个约德尔测试,将约德尔⼈的历史的每个阶段都⽤⼀个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为⼀个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和⿊默丁格观测星空得到的01串做⽐较,得到⼀个相似率。相似率越⾼,则约德尔的未来越光明。
请问:相似率为多少?
输⼊:每组输⼊数据为两⾏,第⼀⾏为有关约德尔⼈历史的字符串,第⼆⾏是⿊默丁格观测星空得到的字符串。(两个字符串的长度相等,字符串长度不⼩于1且不超过1000。)
输出:输出⼀⾏,在这⼀⾏输出相似率。⽤百分数表⽰。(相似率为相同字符的个数/总个数,精确到百分号⼩数点后两位。printf("%%");输出⼀个%。)
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
using namespace std;
string a,b;
bool isAlph(char &c) {
return ((c>='a'&&c<='z')||(c>='A'&&c<='Z'));
}
bool isNum(char &c) {
return (c>='0'&&c<='9');
}
bool isOne(char &c) {
return (isAlph(c)||isNum(c));
}
int main () {
cin>>a>>b;
int l = a.length();
int cnt = 0;
for(int i=0;i<l;++i) {
if(isOne(a[i])^(b[i]=='1'))
continue;
++cnt;
}
double ans = cnt*100.0/l;
printf("%.2lf%%\n", ans);
}
5、路灯
V先⽣有⼀天⼯作到很晚,回家的时候要穿过⼀条长l的笔直的街道,这条街道上有n个路灯。假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能⼒以正数d来衡量,其中d表⽰路灯能够照亮的街道上的点与路灯的最远距离,所有路灯发光能⼒相同。为了让V先⽣看清回家的路,路灯必须照亮整条街道,⼜为了节省电⼒希望到最⼩的d是多少?
输⼊:两⾏数据,第⼀⾏是两个整数:路灯数⽬n (1≤n≤1000),街道长度l (1 ≤l≤109)。第⼆⾏有n个整数ai (0 ≤ ai≤ l),表⽰路灯坐标,多个路灯可以在同⼀个点,也可以安放在终点位置。
输出:能够照亮整个街道的最⼩d,保留两位⼩数。
#include <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
#include <functional>
using namespace std;
//主程序
int main() {
cout << setiosflags(ios::fixed) << setprecision(2);
int n;
int l;
int a[1000];
while (cin >> n >> l) {
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n, greater<int>());
double d = 0;
for (int i = 0; i < n - 1; i++) {
d = max(d, (a[i] - a[i + 1]) / 2.0);
}
d = max(d, (l - a[0]) / 1.0);
d = max(d, a[n - 1] / 1.0);
cout << d << endl;
}
return0;
}
6、翻转数组
给定⼀个长度为n的整数数组a,元素均不相同,问数组是否存在这样⼀个⽚段,只将该⽚段翻转就可以使整个数组升序排列。其中数组⽚段[l,r]表⽰序列a[l], a[l+1], ..., a[r]。原始数组为
a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n],
将⽚段[l,r]反序后的数组是
a[1], a[2], ..., a[l-2], a[l-1], a[r], a[r-1], ..., a[l+1], a[l], a[r+1], a[r+2], ..., a[n-1], a[n]。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int arr[n];
int sortArr[n];
for(int i = 0; i < n; i++){
scanf("%d", &arr[i]);
sortArr[i]=arr[i];
}
sort(sortArr, sortArr + n);
int start = 0, end = n - 1;
while(start < n && arr[start] == sortArr[start])start++;
while(end >= 0 && arr[end] == sortArr[end])end--;
bool ok = true;
while(start < end){
if(sortArr[start] != arr[end]){
ok = false;
break;
}
start++, end--;
}
if(ok)
printf("yes\n");
else
printf("no\n");
return0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。