noip第8課作業


1.     計算書費

【問題描述】下面是一個圖書的單價表:

計算概論 28.9 元/本

數據結構與算法 32.7 元/本

數字邏輯 45.6元/本

C++程序設計教程 78 元/本

人工智能 35 元/本

計算機體系結構 86.2 元/本

編譯原理 27.8元/本

操作系統 43 元/本

計算機網絡 56 元/本

JAVA程序設計 65 元/本

給定每種圖書購買的數量,編程計算應付的總費用。

輸入:輸入一行,包含10個整數(大於等於0,小於等於100),分別表示購買的《計算概論》、《數據結構與算法》、《數字邏輯》、《C++程序設計教程》、《人工智能》、《計算機體系結構》、《編譯原理》、《操作系統》、《計算機網絡》、《JAVA程序設計》的數量(以本為單位)。每兩個整數用一個空格分開。

輸出:輸出一行,包含一個浮點數f,表示應付的總費用。精確到小數點后一位。

【樣例輸入】

1 5 8 10 5 1 1 2 3 4

【樣例輸出】

2140.2

#include<iostream>
#include<iomanip>
using namespace std;
int main() {
    float a[11]={28.9,32.7,45.6,78,35,86.2,27.8,43,56,65},sum=0;
    int i,num;
    for(i=0;i<10;i++){
        cin >> num;
        sum +=num*a[i];
    }
    cout << fixed << setprecision(1) << sum << endl; 

    return 0;
}

2.     輸出序列前N項的數據和

【題目描述】 

  有一組序列的數是:1、2、9、33、126、477,……,請同學們認真觀察數值的規律。現要求:指定項數為任意的N項,計算:

1)第N項的數據;

2)輸出前N項數據的和。

輸入中只有一行,包含1個整數N(其中3<=N<=15)為這個序列的項數。

輸出共有二行:

第一行為這個序列第N項的數據;

第二行為這個序列前N項的數據和。

【要求】每一行的輸出數據都從第一列開始。

【樣例輸入1】

6

【樣例輸出1】

477

648

【樣例輸入2】

10

【樣例輸出2】

98577

133893

#include<iostream>
using namespace std;
int a[1001];
int main() {
    int i,n,k,sum;
    cin >> n;
    if(n==1) {
        cout<<1<<endl<<1;
    }
    if(n==2) {
        cout<<2<<endl<<3;
    }
    if(n>=3) {
        a[1]=1;
        a[2]=2;
        sum=3;
        for(i=3; i<=n; i++) {
            a[i]=(a[i-1]+a[i-2])*3;
            sum +=a[i];
        }
    }
    cout<<a[n]<<endl<<sum;
    return 0;
}

1.     歌手投票

【問題描述】

學校推出10名歌手,校學生會想知道這10名歌手受歡迎的程度,設計一個投票箱,讓每一個同學給自己喜歡的歌手投票,為了方便,學生會把10名歌手用1-10進行編號,這樣,同學們只要用編號進行投票,現在,學生會找到你,幫助統計一下每個歌手獲得的票數。

輸入:兩行第一行是一個整數n,表示參加投票的人數,第二行是n個整數,每個數的取值范圍為[1-10],表示喜歡的歌手。

輸出:兩行,第一行為1-10十個數字,表示選手編號,第二行十個數字,表示各個編號選手獲得的票數。

【樣例輸入】

13

2 8 1 2 6 4 5 9 3 10 5 3 2

【樣例輸出】

1 2 3 4 5 6 7 8 9 10

1 3 2 1 2 1 0 1 1 1

#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
/*
學校推出10名歌手,校學生會想知道這10名歌手受歡迎的程度,
設計一個投票箱,讓每一個同學給自己喜歡的歌手投票,
為了方便,學生會把10名歌手用1-10進行編號,這樣,
同學們只要用編號進行投票,現在,學生會找到你,
幫助統計一下每個歌手獲得的票數。

輸入:兩行第一行是一個整數n,表示參加投票的人數,
第二行是n個整數,每個數的取值范圍為[1-10],表示喜歡的歌手。

輸出:兩行,第一行為1-10十個數字,表示選手編號,
第二行十個數字,表示各個編號選手獲得的票數。
*/ 
 
int main(){
    int n;
    cin>>n;
    int a;
    int arr[101]={0,0,0,0,0,0,0,0,0,0};

    for(int i=0;i<n;i++){
        cin>>a;
        switch(a){
            case 1:
                arr[0]++;
                break;
            case 2:
                arr[1]++;
                break;
            case 3:
                arr[2]++;
                break;
            case 4:
                arr[3]++;
                break;
            case 5:
                arr[4]++;
                break;
            case 6:
                arr[5]++;
                break;
            case 7:
                arr[6]++;
                break;
            case 8:
                arr[7]++;
                break;
            case 9:
                arr[8]++;
                break;
            case 10:
                arr[9]++;
                break;
            default:
                cout<<"沒有你要投的選手"<<endl; 
        }
    } 
    for(int i=0;i<10;i++){
        cout<<i+1<<" ";
        if(i==9){
            cout<<endl;
        }
    }
    for(int i=0;i<10;i++){
        cout<<arr[i]<<" ";
    }
    
    
    
    return 0;
}

2.     校門外的樹

【問題描述】

某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。

由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的坐標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走后,馬路上還有多少棵樹。

輸入:第一行有兩個整數L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的坐標。

對於20%的數據,區域之間沒有重合的部分;

對於其它的數據,區域之間有重合的情況。

輸出:包括一行,這一行只包含一個整數,表示馬路上剩余的樹的數目。

【樣例輸入】

500 3 150 300 100 200 470 471

【樣例輸出】

298

#include<iostream>
using namespace std;
int a[10001];
int main() {
    int i,j,l,m,q,z,count=0;
    cin >> l >> m;
    for(i=0; i<=l; i++){
        a[i]=1;
    } 
    for(i=0; i<m; i++) {
        cin >> q >> z;
        for(j=q; j<=z; j++) {
            if(a[j]==1) {
                a[j]=1-a[j];
            }
        }
    }
    for(i=0; i<=l; i++) {
        if(a[i]) count++;
    }
    cout << count<<endl;
    return 0;
}

3.     石頭剪刀布

【問題描述】

石頭剪刀布是常見的猜拳游戲。石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一樣,則不分勝負。

一天,小A和小B正好在玩石頭剪刀布。已知他們的出拳都是有周期性規律的,比如:“石頭-布-石頭-剪刀-石頭-布-石頭-剪刀……”,就是以“石頭-布-石頭-剪刀”為周期不斷循環的。請問,小A和小B比了N輪之后,誰贏的輪數多?

輸入:輸入包含三行。

第一行包含三個整數:N,NA,NB,分別表示比了N輪,小A出拳的周期長度,小B出拳的周期長度。0 < N,NA,NB < 100。

第二行包含NA個整數,表示小A出拳的規律。

第三行包含NB個整數,表示小B出拳的規律。

其中,0表示“石頭”,2表示“剪刀”,5表示“布”。相鄰兩個整數之間用單個空格隔開。

輸出:輸出一行,如果小A贏的輪數多,輸出A;如果小B贏的輪數多,輸出B;如果兩人打平,輸出draw。

【樣例輸入】

10 3 4

0 2 5

0 5 0 2

【樣例輸出】

A

【提示】對於測試數據,猜拳過程為:

A:0 2 5 0 2 5 0 2 5 0

B:0 5 0 2 0 5 0 2 0 5

A贏了4輪,B贏了2輪,雙方打平4輪,所以A贏的輪數多。

#include<iostream>
using namespace std;
int main() {
    /*int i,N,NA,NB,a[100],b[100],awin = 0,bwin = 0;
    cin >> N >> NA >> NB;
    for(i=0;i<NA;i++) cin >> a[i];
    for(i=0;i<NB;i++) cin >> b[i];
    for(i=0;i<N;i++){
        if((a[i%NA]==0&&b[i%NB]==2)||
           (a[i%NA]==5&&b[i%NB]==0)||
           (a[i%NA]==2&&b[i%NB]==5)){
               awin++;
           }
        if((b[i%NB]==0&&a[i%NA]==2)||
           (b[i%NB]==5&&a[i%NA]==0)||
           (b[i%NB]==2&&a[i%NA]==5)){
               bwin++;
           }
    } 
    if(awin>bwin){
        cout << "A"<<endl;
    }else if(awin<bwin){
        cout << "B";
    }else{
        cout << "draw";
    }*/
    
    int j,la,lb,af=0,bf=0,h;
    cin>>j>>la>>lb;
    int a[la];
    int b[lb];
     for(int i=0;i<la;i++){
        cin>>a[i];
    }
    for(int i=0;i<lb;i++){
        cin>>b[i];
    }
    for(int k=0;k<j;k++){
        //a贏得次數 
        if((a[k%la]==5&&b[k%lb]==0)||(a[k%la]==2&&b[k%lb]==5)||(a[k%la]==0&&b[k%lb]==2)){
            af=af+1;
        }
        //b贏得次數 
        if((b[k%lb]==5&&a[k%la]==0)||(b[k%lb]==2&&a[k%la]==5)||(b[k%lb]==0&&a[k%la]==2)){
            bf=bf+1;
        }
    }
    
    if(af>bf){
        cout<<"A";
    }else if(bf>af){
        cout<<"B";
    }else{
        cout<<"draw";
    }
    return 0;
}

 


免責聲明!

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



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