首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

田忌賽馬問題:C++ 代碼邏輯錯誤修正

     編輯:程式設計疑難解答

原代碼關鍵錯誤


else if(t[t1]  // 這裡代碼不完整,疑似漏掉條件
else
{
    if(t[t2] > k[k2]) { ans++; t2--; k2--; }
    else { if(t[t2] < k[k2]) ans--; t1++; k2--; }
}

標準貪心策略

  1. 雙方最快馬比較:我快 → 上最快贏一局;對方快 → 用最慢犧牲輸一局。
  2. 最快相等:比較最慢馬:我慢馬贏 → 上最慢贏;否則用最慢犧牲 (若比對方最快慢則輸,相等則平)。

修正後完整代碼


#include 
using namespace std;

int main() {
    int n;
    while (cin >> n && n) {
        vector t(n), k(n);
        for (int &x : t) cin >> x;
        for (int &x : k) cin >> x;
        sort(t.begin(), t.end());
        sort(k.begin(), k.end());
        
        int t1 = 0, t2 = n - 1, k1 = 0, k2 = n - 1;
        int ans = 0;
        while (t1 <= t2) {
            if (t[t1] > k[k1]) { ans++; t1++; k1++; }           // 我最快 > 對方最快
            else if (t[t1] < k[k1]) { ans--; t1++; k2--; }       // 我最快 < 對方最快,犧牲最慢
            else { // 我最快 == 對方最快
                if (t[t2] > k[k2]) { ans++; t2--; k2--; }       // 我最慢 > 對方最慢
                else {
                    if (t[t1] < k[k2]) ans--; // 我最快 < 對方最快 (即最慢也輸)
                    t1++; k2--; // 犧牲我最快 (或最慢) 換對方最快
                }
            }
        }
        cout << ans * 200 << endl;
    }
    return 0;
}

提問者自述

「謝謝,改過來了,最後一個 else 錯了」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved