在線筆試— 賽碼網試題(一)


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;

    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;
    return 0;
}

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;
    }
    return 0;
}

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;
    }

    return 0;
}

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");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM