1. 程式人生 > >2018CCF計算機軟體能力認證試題

2018CCF計算機軟體能力認證試題

1. 201803-1 跳一跳

問題描述
  近來,跳一跳這款小遊戲風靡全國,受到不少玩家的喜愛。
  簡化後的跳一跳規則如下:玩家每次從當前方塊跳到下一個方塊,如果沒有跳到下一個方塊上則遊戲結束。
  如果跳到了方塊上,但沒有跳到方塊的中心則獲得1分;跳到方塊中心時,若上一次的得分為1分或這是本局遊戲的第一次跳躍則此次得分為2分,否則此次得分比上一次得分多兩分(即連續跳到方塊中心時,總得分將+2,+4,+6,+8…)。
  現在給出一個人跳一跳的全過程,請你求出他本局遊戲的得分(按照題目描述的規則)。
輸入格式
  輸入包含多個數字,用空格分隔,每個數字都是1,2,0之一,1表示此次跳躍跳到了方塊上但是沒有跳到中心,2表示此次跳躍跳到了方塊上並且跳到了方塊中心,0表示此次跳躍沒有跳到方塊上(此時遊戲結束)。
輸出格式
  輸出一個整數,為本局遊戲的得分(在本題的規則下)。
樣例輸入
1 1 2 2 2 1 1 2 2 0
樣例輸出
22
資料規模和約定
  對於所有評測用例,輸入的數字不超過30個,保證0正好出現一次且為最後一個數字。

#include <iostream>
using namespace std;

int main()
{
    int a[30];
    int i = 0;
    /*此處之所以 先提取了第一個 是因為 cin.get()會把第一個數字給吃了(除非第一個
    數字前有空格)*/
    cin >> a[i];
    i++;
    //cin.get() 可以提取出 空格 tab 回車 
    while (cin.get() != '\n'&&i<30)
    {
        cin >> a[i];
        i++;
    }
    i = 0
; int num = 0; int count = 0;//count的作用在於多次跳到中心的累加值 while (i <= sizeof(a)) { if (a[i] != 0) { if (a[i] == 1) { num = num + 1; count = 0; } else if (a[i] == 2) { count = count + 2; num = num + count; } } else
{ count = 0; break; } i++; } cout << num; }

輸出結果
 這裡寫圖片描述 
網上的簡便方法

#include <iostream>
using namespace std;

int main(){
int a,count=0,s=0;
while(cin>>a){
if(a==0)
break;
else{
if(a==2){
count++;
s+=count*a;
}
if(a==1){
count=0;
s+=a;
}
}
}
cout<<s<<endl;
return 0;
} 
  1. 201803-2 碰撞的小球
    問題描述
      數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在座標L處。有n個不計體積的小球線上段上,開始時所有的小球都處在偶數座標上,速度方向向右,速度大小為1單位長度每秒。
      當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。
      當兩個小球撞到一起的時候,兩個小球會分別向與自己原來移動的方向相反的方向,以原來的速度大小繼續移動。
      現在,告訴你線段的長度L,小球數量n,以及n個小球的初始位置,請你計算t秒之後,各個小球的位置。
    提示
      因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。
      同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。
    輸入格式
      輸入的第一行包含三個整數n, L, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之後小球的位置。
      第二行包含n個整數a1, a2, …, an,用空格分隔,表示初始時刻n個小球的位置。
    輸出格式
      輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位於ai的小球,在t秒之後的位置。
    樣例輸入
    3 10 5
    4 6 8
    樣例輸出
    7 9 9
    樣例輸入
    10 22 30
    14 12 16 6 10 2 8 20 18 4
    樣例輸出
    6 6 8 2 4 0 4 12 10 2
    資料規模和約定
      對於所有評測用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L為偶數。
      保證所有小球的初始位置互不相同且均為偶數。
//該程式碼存在錯誤 得分為10的版本 結果6 6 8 2 4 0 4 12 10 2 但是這個程式碼執行結果中的各個數字
//位置不同
#include <iostream>
using namespace std;
int main()
{
    int n = 1, L, t;
    cin >> n >> L >> t;
    int a[100];
    cin >> a[0];
    int c[100];
    for (int i2 = 0; i2<n; i2++)
    {
        c[i2] = 1;
    }
    int i = 1, i1 = 1;
    while (cin.get() != '\n'&&i<n)
    {
        cin >> a[i];
        i++;
    }

    while (i1 <= t)
    {
        for (int i3 = 0; i3<n; i3++)
        {
            if (c[i3] == 1)
            {
                if (a[i3] <= (L - 2)) {

                    a[i3] = a[i3] + 1;

                }else if (a[i3] == (L - 1) && c[i3] == 1) {
                    a[i3] = a[i3] + 1;
                    c[i3] = -c[i3];
                }


            }else {
                if (a[i3] >= 2) {
                    a[i3] = a[i3] - 1;
                }
                else if (a[i3] == 1 && c[i3] == -1) {
                    a[i3] = a[i3] - 1;
                    c[i3] = -c[i3];
                }

            }
            if (a[i3] == a[i3 - 1] && c[i3] != c[i3 - 1]) {
                c[i3] = -c[i3];
                c[i3 - 1] = -c[i3 - 1];
            }
            else if (a[i3] == a[i3 + 1] && c[i3] != c[i3 + 1]) {
                c[i3] = -c[i3];
                c[i3 + 1] = -c[i3 + 1];
            }
        }
        i1++;

    }
    int i4 = 0;
    while (i4<n) {
        cout << a[i4] << " ";
        i4++;
    }
}