Thinking Process

題目資料給的很大,顯然不是模擬的意思。所以應是利用貪心思想。

思路是先對所給三個數值按降序排序,得到a、b、c。然後判斷a與(b + c) * 2的關係:

若a >= (b + c) * 2,則拿兩個a分別給b或c,則限制因素為b+c。所以最後解為b+c(a剩餘多了)。如果是三種顏色都挑,則提高了題目的要求,也就是只需三個顏色不都相同就可以。

若a < (b+c) * 2,則限制因素為a。這時解為(a + b + c) / 3。解釋是:首先可以發現在滿足這個條件時,a是不夠的,也就是說在a兩個兩個取完之前,b和c一定至少有一個還有剩。那麼假設一個資料 3 3 2。模擬:1 2 2;0 0 2。也就是後面一定會剩下。那麼是否會出現最後是0 1 6這種情況呢?也就是b的個數又成為限制因素。

我反推了試試:0 1 6;2 2 6;4 3 6;6 4 6;8 5 6;10 6 6(5個桌子)。

而實際上對於這個資料正確解法應是10 6 6;8 5 6;6 5 5;4 4 5;2 4 4;0 3 4;0 3 2;0 1 1(7個桌子)。

所以,0 1 6這種情況的出現是因為在中間的選擇過程中就已經不滿足貪心。

也就是說最後剩下的兩個一定會是用到0 1、1 0、1 1三者之一,即剩下1個或2個。

所以整數除法(a + b + c) / 3 為正解。

Code

Time Complexity: , Space Complexity:

#include<bits/stdc++.h>
 
using ll = long long;
using ld = long double;
using namespace std;
 
 
void run_case(){ 
    vector<ll> A(3);
    cin >> A[0] >> A[1] >> A[2];
    sort(A.begin(), A.end());
 
    if(2 * (A[0] + A[1]) <= A[2])
        cout << A[0] + A[1] << "\n";
    else 
        cout << (A[0] + A[1] + A[2]) / 3 << "\n";
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(NULL);
    int tests = 1;
    // cin >> tests;
    while(tests--){
        run_case();
    }
    return 0;
}
 

Source