noip第18課作業


1. 銀行取款

【題目描述】

     在現代文明社會中,大家在諸如銀行辦理業務、車站買票等活動時都很文明沒有插隊的現象,本着“先來先服務”的規矩。

    新年馬上到了,明明的爸爸打算上銀行去取點錢,帶着一向表現很好的明明同學到三亞旅游,明明的爸爸到銀行時發現很多人在辦理業務,明明的爸爸就自覺地在排隊機上去了一個業務號碼,並焦急的等待着銀行櫃台叫自己的號碼......

【輸入文件】

輸入文件名:bank.in

輸入中包含I(表示等待辦理業務)和顧客的序號,或者 O(表示辦理完業務的人離開);

輸入數據不超過100行。

【輸出文件】

輸出文件名:bank.out

輸出銀行排隊中出隊顧客序列,若隊列為空(沒人等待),則輸出“None”

【樣例輸入】

O

I 1

I 2

O

I 3

O

O

O

【樣例輸出】

None

1

2

3

None

#include <iostream>
using namespace std;
int main(){
    int q[101]={};
    int head ,tail;
    head = tail = 0;
    char ch;
    while(cin >> ch){
        if(ch == 'O'){
            if (head >= tail)
                cout<<"None"<<endl;
            else {
                cout<<q[head]<<endl;
                head++;
            }
        }
        if(ch == 'I'){
            tail++;
            cin >> q[tail];
        }
    } 
    return 0;
}

2.選小壽星

【問題描述】

五年級一班有一個傳統,全班一起慶祝當月過生日的同學。有m名學生都是11月份過生日,班主任決定挑一名學生作為壽星代表切蛋糕。班主任將過生日的m名學 生隨機圍成一個圈,從1到m進行編號。隨機挑一個數字n(1<=n<=9),從第一個同學開始連續報數,報數到n的同學就出局,然后從下一位 同學重新開始報數,一直到剩下最后一名同學。由於女生少,班主任決定每個女生有2次機會,也就是說,每名女生第2次數到n時才出局。

例如,m=3,其中有1名女生,編號順序為1,2,3,分別是男,女,男,n=2。第一輪報數,報到的是2號女生,暫不出局(注:女生有2次機會)。第二輪報數, 3號男生報1,1號男生報2出局。第三輪報數,2號女生報1,3號男生報2出局,最后留下2號女生。 有m=5,其中2名女生,編號順序為1,2,3,4,5,分別為男,男,女,女,男。n=3。挑選后的結果是5號,男生。(注:女生有2次機會)      

【輸入文件】 文件名:choice.in

文件中第一行輸入數字為m,表示有m個人,m<20; 第二行是m個整數,1代表男生,0代表女生。 第三行是n,表示n是出局數字。(注意:女生有2次機會)

【輸出文件】 文件名:choice.out     輸出留下學生的序號。

【樣例輸入】

 5

 1 1 0 0 1

 3           

【樣例輸出】

  5   

#include <iostream>
using namespace std;
int main(){
    int a[101];
    int n,m,t; 
    cin >> n;
    int count = n;
    int s = 0;
    for(int i = 0;i <n;i++){    
        cin >> t;
        if(t == 1){
            a[i] = 1;
        }else{
            a[i] = 2;
        }
    }
    cin >> m;
    int i = 0;
    while(count > 1){
        if(a[i] >0){
            s++;
        }
        if(s == m){
            a[i]--;
            if(a[i] == 0){
                count--;
            }
            s = 0;
        }
        i++;
        i%=n; 
    }
    for(i = 0;i <n;i++){
        if(a[i]){
            cout << i + 1<< endl;
        }
    }
    return 0;
}

1.Blash數集

【題目描述】

大數學家高斯小時候偶然間發現一種有趣的自然數集合Blash,對應以a為基的集合Ba定義如下:
(1)a是集合Ba的基,且a是Ba的第一個元素;
(2)如果x在集合Ba中,則2x+1和3x+1也都在集合Ba中;
(3)沒有其他元素在集合Ba中了。
現在小高斯想知道如果將集合Ba中元素按照升序排列,第n個元素會是多少?

【輸入格式】輸入包含很多行,每行輸入包括兩個數字,集合的基a(1<=a<=50)以及所求元素序號n(1<=n<=1000000)。

【輸出格式】對應每個輸入,輸出集合Ba的第n個元素值。

【樣例輸入】

  1 100
  28 5437

【樣例輸出】

  418

  900585

#include<iostream>
using namespace std;
const int N = 1000000;
int a,n,q[N];
void blash(int a,int n) {
    q[1] = a;
    int tail = 1,head2,head3;
    head2 = head3 = 1;
    while(tail <= n) {
        long long x = 2*q[head2]+1;
        long long y = 3*q[head3]+1;
        if(x < y) {
            q[++tail] = x;
            head2++;
        } else {
            if(x > y) {
                q[++tail] = y;
                head3++;
            } else {
                q[++tail] = x;
                head2++;
                head3++;
            }
        }
    }
    cout << q[n] << endl;
}
int main() {
    while(cin >> a >> n) {
        blash(a,n);
    }
    return 0;
}

2.移動的小球

【問題描述】

你有一些小球,從左到右依次編號為1,2,3,…,n,你可以執行兩種指令。其中A X Y表示把小球X移動到小球Y左邊,B X Y表示把小球X移動到小球Y右邊。指令保證合法,即X不等於Y。
輸入:小球個數n。指令條數m和m條指令,注意,1≤n≤500000,0≤m≤100000。
輸出: 從左到右輸出最后的小球序列。
【樣例輸入】
 6 2
 A 1 4
 B 3 5
【樣例輸出】
 2 1 4 5 3 6

#include <iostream>
using namespace std;
const int N = 500001;
int n,A[N];
int find(int X) {
    for(int i = 1; i <= n; i++)
        if(A[i] == X) return i;
    return 0;
}
void left(int a, int b) {
    int t = A[a-1];
    for(int i = a; i <= b; i++) {
        A[i-1] = A[i];
    }
    A[b] = t;
}
void right(int a, int b) {
    int t = A[a];
    for(int i = a; i >= b; i--) {
        A[i+1] = A[i];
    }
    A[b] = t;
}
int main() {
    int m, X, Y, p, q;
    char type;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        A[i] = i;
    for(int i = 1; i <= m; i++) {
        cin >> type >> X >> Y;
        p = find(X);
        q = find(Y);
        if(type == 'A') {
            if(q > p)
                left(p+1, q-1);
            else right(p-1, q);
        } else {
            if(q > p)
                left(p+1, q);
            else right(p-1, q+1);
        }
    }
    for(int i = 1; i <= n; i++) {
        cout << A[i] << " ";
    }
    cout << endl;
    return 0;
}

 


免責聲明!

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



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