1 条题解

  • 2
    @ 2025-11-22 18:59:00

    解法一 所有 nn 的答案都是 2n22n-2

    我们先来看看胜者组。请注意,该组每场比赛正好有一支球队跌入败者组。在比赛结束前,胜者组只剩下一支球队,因此在决赛前,胜者组一定进行了 n1n-1 场比赛。

    类似的逻辑也适用于败者组。在比赛过程中,共有 n1n-1 支球队降入败者组。该组的两支球队每进行一场比赛,就会有一支球队被淘汰出局。在决赛前,该组只剩下一支球队,因此在决赛前,败者组一定进行了 n2n-2 场比赛。

    最后,我们将最后一场比赛加到我们的计算中,使总数达到

    (n1)+(n2)+1=2n2(n-1)+(n-2)+1 = 2n-2

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main() {
    
      int n, t; 
    
      cin >> t;
    
      while(t--) {
    
         cin >> n;
    
         cout << 2*n-2 << "\n";
    
      }
    
    }```
    
    ```
    

    解法二 或者,我们也可以直接模拟这一过程。

    假设在一轮比赛之前,胜者组有 aa 支球队,败者组有 bb 支球队。

    首先, b2\left \lfloor \frac{b}{2} \right \rfloor 场比赛在败者组球队中进行,因此 b2\left \lfloor \frac{b}{2} \right \rfloor 场比赛在这一步被淘汰。我们从 bb 中减去这个数字,再加上 b2\left \lfloor \frac{b}{2} \right \rfloor ,就得出了比赛总数。

    然后, a2\left \lfloor \frac{a}{2} \right \rfloor 场比赛在胜者组球队中进行,因此 a2\left \lfloor \frac{a}{2} \right \rfloor 场比赛落入败者组。我们从 bb 中减去这个数字,再加上 b2\left \lfloor \frac{b}{2} \right \rfloor ,就得出了比赛总数。

    如上所述,在模拟了 O(log(n))\mathcal{O}(\log (n)) 轮比赛后,两组都只剩下一支球队,因此我们在总场次上加上 11

    时间复杂度: O(log(n))\mathcal{O}(\log (n))

    #include <bits/stdc++.h>
     
    using namespace std;
     
    int main() {
    	
    	int n, t, winners, losers, ans;
    	
    	cin >> t;
    	
    	while(t--) {
    	   cin >> n;
    	   winners = n;
    	   losers = 0;
    	   ans = 0;
    	   
    	   while(max(losers, winners) > 1) {
    	       ans += losers/2;
    	       losers = (losers+1)/2;
    	       
    	       ans += winners/2; 
    	       losers += winners/2; 
    	       winners++;
    	       winners /= 2;
    	   }
    	   
    	   ans++;
    	   
    	   cout << ans << "\n";
    	}
    }
    ```
    
    ```
    

    信息

    ID
    1212
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    124
    已通过
    31
    上传者