#29232: #求解(測資#3 #4都比答案多1 )


tingan920325@gmail.com (tingan)

學校 : 不指定學校
編號 : 88567
來源 : [36.238.127.29]
最後登入時間 :
2022-02-07 17:58:56
a350. 3. 緞帶的購買問題 -- 100學年度北基區資訊學科能力競賽 | From: [36.238.127.29] | 發表日期 : 2022-02-07 21:21

我的程式碼如下,因為不想把陣列傳進func裡,但不知道要怎麼寫,所以就用了class把函式跟變數都包起來,感覺是個奇怪的寫法XD。

測資3 4的答案分別是2跟18,但我跑出來是3跟19,其他的測資都沒問題,是不是邊界的條件有問題呢? 還是有其他出錯的地方? 謝謝各位大神!

#include<iostream>
using namespace std;
class solution{
public:
    solution(): current(0), numribbon(0){;}
    bool ifnotsuccess(){
        for(int i = 8 ; i >= 0 ; i--){
            if(num[i] > 0 && lenFlower[i] > length){
                cout << "NO SOLUTION!!" << endl;
                return true;
            }
        }
       
        return false;
    }
    void set(){
        cin >> length;
        for(int i = 0 ; i < 9 ; i++) cin >> num[i];
        countdown = 0;
        for(int i = 0; i < 9 ; i++) countdown += num[i];
    }
    int solu(){
        return recursion(current, numribbon, countdown);
    }
    int recursion(int current, int numribbon, int countdown){
       
        bool newribbon = true;
        for(int i = 8 ; i >= 0 ; i--){
            if(num[i] > 0){
                if(current >= lenFlower[i]){
                    current -= lenFlower[i];
                    num[i]--;
                    newribbon = false;
                    countdown--;
                    break;
                }
            }
        }
        if(countdown == 0) return numribbon;

        if(!newribbon) return recursion(current, numribbon, countdown);
        else return recursion(length, numribbon+1, countdown);
    };
private:
    int length;
    int num[9];
    int lenFlower[9] = {8, 16, 24, 32, 40, 48, 56, 64, 80};
    int current;
    int countdown;
    int numribbon;
   
};

int main(){

    solution c;
    c.set();
    if(c.ifnotsuccess()) return 0;
    cout << c.solu() << endl;

    return 0;
}
 
#29234: Re:#求解(測資#3 #4都比答案多1 )


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
a350. 3. 緞帶的購買問題 -- 100學年度北基區資訊學科能力競賽 | From: [39.9.78.101] | 發表日期 : 2022-02-07 22:50

我的程式碼如下,因為不想把陣列傳進func裡,但不知道要怎麼寫,所以就用了class把函式跟變數都包起來,感覺是個奇怪的寫法XD。

測資3 4的答案分別是2跟18,但我跑出來是3跟19,其他的測資都沒問題,是不是邊界的條件有問題呢? 還是有其他出錯的地方? 謝謝各位大神!

#include
using namespace std;
class solution{
public:
    solution(): current(0), numribbon(0){;}
    bool ifnotsuccess(){
        for(int i = 8 ; i >= 0 ; i--){
            if(num[i] > 0 && lenFlower[i] > length){
                cout << "NO SOLUTION!!" << endl;
                return true;
            }
        }
       
        return false;
    }
    void set(){
        cin >> length;
        for(int i = 0 ; i < 9 ; i++) cin >> num[i];
        countdown = 0;
        for(int i = 0; i < 9 ; i++) countdown += num[i];
    }
    int solu(){
        return recursion(current, numribbon, countdown);
    }
    int recursion(int current, int numribbon, int countdown){
       
        bool newribbon = true;
        for(int i = 8 ; i >= 0 ; i--){
            if(num[i] > 0){
                if(current >= lenFlower[i]){
                    current -= lenFlower[i];
                    num[i]--;
                    newribbon = false;
                    countdown--;
                    break;
                }
            }
        }
        if(countdown == 0) return numribbon;

        if(!newribbon) return recursion(current, numribbon, countdown);
        else return recursion(length, numribbon+1, countdown);
    };
private:
    int length;
    int num[9];
    int lenFlower[9] = {8, 16, 24, 32, 40, 48, 56, 64, 80};
    int current;
    int countdown;
    int numribbon;
   
};

int main(){

    solution c;
    c.set();
    if(c.ifnotsuccess()) return 0;
    cout << c.solu() << endl;

    return 0;
}


這種寫法沒辦法讓緞帶最少吧

舉例,如果測資是

192
0 0 0 0 0 0 2 3 1

你的程式會輸出3

 

 
ZeroJudge Forum