第九屆藍橋杯大賽個人賽決賽(軟體類本科B組)做題筆記 mit zwei Antworten

Vorüarn0362發表於2020-10-27

標題:換零鈔

x星球的鈔票的面額只有:100元,5元,2元,1元,共4種。
小明去x星旅遊,他手裡只有2張100元的x星幣,太不方便,恰好路過x星銀行就去換零錢。
小明有點強迫症,他堅持要求200元換出的零鈔中2元的張數剛好是1元的張數的10倍,
剩下的當然都是5元面額的。

銀行的工作人員有點為難,你能幫助算出:在滿足小明要求的前提下,最少要換給他多少張鈔票嗎?
(5元,2元,1元面額的必須都有,不能是0)

注意,需要提交的是一個整數,不要填寫任何多餘的內容。
Ans=74

Codes:
#include <iostream>

using namespace std;

/*
    
    標題:換零鈔

    x星球的鈔票的面額只有:100元,5元,2元,1元,共4種。
    小明去x星旅遊,他手裡只有2張100元的x星幣,太不方便,恰好路過x星銀行就去換零錢。
    小明有點強迫症,他堅持要求200元換出的零鈔中2元的張數剛好是1元的張數的10倍,
    剩下的當然都是5元面額的。

    銀行的工作人員有點為難,你能幫助算出:在滿足小明要求的前提下,最少要換給他多少張鈔票嗎?
    (5元,2元,1元面額的必須都有,不能是0)

    注意,需要提交的是一個整數,不要填寫任何多餘的內容。

*/


int main(){

    int minN=1E6;
    for(int i=1;21*i<=200;i++){//i: 1元 的張數
        int five=200-21*i;
        int thisN=0;
        if(five%5==0){
            thisN=11*i+five/5; 
            cout<<i<<"張 1元 "<<10*i<<"張2元 "<<five/5<<"張5元"<<endl;
            minN=min(minN,thisN);
        }
    }

    cout<<minN<<endl;
    system("pause");
    return 0;
}
 


標題:鐳射樣式

x星球的盛大節日為增加氣氛,用30臺機光器一字排開,向太空中打出光柱。
安裝除錯的時候才發現,不知什麼原因,相鄰的兩臺鐳射器不能同時開啟!
國王很想知道,在目前這種bug存在的情況下,一共能打出多少種鐳射效果?

顯然,如果只有3臺機器,一共可以成5種樣式,即:
全都關上(sorry, 此時無聲勝有聲,這也算一種)
開一臺,共3種
開兩臺,只1種

30臺就不好算了,國王只好請你幫忙了。

要求提交一個整數,表示30臺鐳射器能形成的樣式種數。

注意,只提交一個整數,不要填寫任何多餘的內容。

Ans=2178309

Codes:

#include <iostream>

#include <algorithm>

#include <cmath>

 

using namespace std;

 

int arr[30];

long long ans=31;

 

void init(int num){

    for(int i=0;i<30;i++)

        arr[i]=0;

    for(int i=0;i<num;i++)

        arr[i]=1;

    sort(arr,arr+30);

 

}

 

bool check(){

    if( (arr[0]==1 && arr[1]==1) || (arr[30-1]==1 && arr[30-2]==1))

        return false;

 

    for(int i=1;i<30-1;i++){//相鄰相鄰的兩臺鐳射器不能同時開啟!

        if(arr[i]==1 && (arr[i-1]==1 || arr[i+1]==1 ))

            return false;

    }

    return true;

}

 

void PrintArr(){

    for(int i=0;i<30;i++)

        cout<<arr[i]<<" ";

    cout<<endl;

}

 

void demo(int chose){

   init(chose);

    do{

        if(check()){

            ans++; 

            // PrintArr();

            if(ans%100000==0)

                 cout<<ans<<endl; 

        }          

 

    }while(next_permutation(arr,arr+30));

}

 

// 0~ceil(1.0*n/2)全排列+check

int main(){

    for(int i=2;i<=ceil(1.0*30/2);i++)

        demo(i);

 

    cout<<ans<<endl;

    cout<<"hello world!"<<endl;

    system("pause");

    return 0;

}

相關文章