#33076: C++ 答案跟範例2的資測數字不吻合


e002933 (徐MAN)

學校 : 不指定學校
編號 : 158405
來源 : [111.71.113.217]
最後登入時間 :
2023-11-18 16:56:51
h082. 2. 贏家預測 -- 2022年1月APCS | From: [163.20.42.253] | 發表日期 : 2022-11-28 13:47

以下附上我的程式碼:

其中有標斜線,大約65行左右有試著印出每一回答結束後的戰力,應變力還有下一回合的順序

但我印出的數字與答案都不吻合

有試著改s和t為float,結果答案差更多

想知道問題出在哪裡

謝謝回答

#include<iostream>
using namespace std;
#include<vector>

struct player{
    long long int s;
    long long int t;
    int lose;
};

int main() {
    int n, m;
    cin>>n>>m;
    struct player p[n+1];
    for(int i = 1; i <= n; i++) {
        p[i].lose = 0;
        cin>>p[i].s;
    }
    for(int i = 1; i <= n; i++)
        cin>>p[i].t;
    vector<int> pr;
    for(int i = 0; i < n; i++) {
        int temp;
        cin>>temp;
        pr.push_back(temp);
    }
    vector<int> w, l;
    int num = n;
    while(num > 1) {
        for(int i = 0; i < n; i+=2) {
            int a = p[pr[i]].s, b = p[pr[i]].t, c = p[pr[i+1]].s, d = p[pr[i+1]].t;
            if(a*b >= c*d) {
                p[pr[i]].s = a+c*d/2/b;
                p[pr[i]].t = b+c*d/2/a;
                p[pr[i+1]].s = c+c/2;
                p[pr[i+1]].t = d+d/2;
                p[pr[i+1]].lose++;
                if(p[pr[i+1]].lose >= m)
                    num--;
                else
                    l.push_back(pr[i+1]);
                w.push_back(pr[i]);

            }
            else{
                p[pr[i+1]].s = c+a*b/2/d;
                p[pr[i+1]].t = d+a*b/2/c;
                p[pr[i+1]].s = a+a/2;
                p[pr[i+1]].t = b+b/2;
                p[pr[i]].lose++;
                if(p[pr[i]].lose >= m)
                    num--;
                else
                    l.push_back(pr[i]);
                w.push_back(pr[i+1]);
            }
        }
        if(n%2 != 0)
            w.push_back(pr[n-1]);
        pr.clear();
        pr.insert(pr.end(), w.begin(), w.end());
        pr.insert(pr.end(), l.begin(), l.end());
        w.clear();
        l.clear();
        n = num;
    /*    for(int i = 0; i < n; i++)
            cout<<pr[i]<<" ";
        cout<<endl;
        for(int i = 1; i <= n; i++)
            cout<<p[i].s<<" ";
        cout<<endl;
        for(int i = 1; i <= n; i++)
            cout<<p[i].t<<" ";
        cout<<endl;
        for(int i = 1; i <= n; i++)
            cout<<p[i].lose<<" ";
        cout<<endl<<"-----"<<endl;*/
    }
    cout<<pr[0];
    return 0;
}

 
#33078: Re: C++ 答案跟範例2的資測數字不吻合


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [36.229.42.175]
最後登入時間 :
2024-11-18 13:03:08
h082. 2. 贏家預測 -- 2022年1月APCS | From: [111.249.86.1] | 發表日期 : 2022-11-28 19:22

你程式碼的 a, b, c, d 都用整數來計算就是出問題的主因。

再者題目提到戰力和應變力計算時除法皆為無條件捨去,這部分應該就不需要浮點數來儲存型態

 
ZeroJudge Forum