原題鏈接
6478. 誰進線下了?III - AcWing題庫
這是一道睿抗(省賽)題
一開始睿抗是啥都不知道? 然后一看是省賽嚇得我不輕
但讀完題簡簡單單
一道很水的模擬題(誰能解釋一下睿抗啥意思)
一起開康康
題目
Xepa Legends 是一個第一人稱射擊類大逃殺(“吃雞”)游戲,每輪游戲共有?20支?33人小隊參加,最后獲勝的隊伍被稱為“捍衛者”。
最近 Xepa Legends 舉行了亞太地區南賽區的線上比賽,爭奪?77?個前往沙特阿拉伯利雅得參加線下賽的資格,國內共有?15 支隊伍參與到了其中。
因為比賽十分激烈,直到最后誰進了線下仍有巨大的疑問。
小?K?喜歡的國內知名戰隊 DreamTear 因其隊內選手漢堡包表現不佳,正好卡在出線分數前后(是的,真的又是這樣),請你趕緊幫幫小?K,看看他喜歡的戰隊有沒有機會出線吧!
因為這次離出線有點距離,我們主要關注的是一個非常特殊的規則:獎勵分規則。
以下是獎勵分規則的詳情:
- 如果任意一支隊伍在一輪比賽獲得?50% 或以上的場次獲得第一,則獲得?1?分獎勵分;
- 如果在該輪比賽結束后,排行第一的隊伍領先第二名?50分及以上,則獲得?1分獎勵分。
現在給定 DreamTear 戰隊一輪中每場比賽的名次及得分,以及最后當輪比賽第二名隊伍的總分,請你告訴小?K,這兩分獎勵分 DreamTear 戰隊能不能獲得。
注意獎勵分是單獨的一個分數,不參與當輪比賽的得分計算中。
輸入格式
輸入第一行是一個正整數?T,表示有?T組數據。
接下來的?T部分數據,每部分數據第一行是兩個正整數?N,S,,表示一輪比賽里共打了?N場比賽,第二名的隊伍最后獲得了?S分。
接下來的?N行,每行是兩個非負整數?Ri,Ci,表示 DreamTear 戰隊一場比賽獲得的排名,以及該場比賽的總分。
輸出格式
對于每組數據,輸出兩個數,第一個數表示能不能獲得大于等于?50%50%?場次第一的獎勵分,第二個數表示能不能獲得超過第二名隊伍得分?5050?分及以上的獎勵分,00?表示不能,11?表示能,用一個空格隔開。
數據范圍
1≤T≤5,
1≤N≤20,
0≤S≤500,
1≤Ri≤20,
0≤Ci≤70
輸入樣例:
3
6 67
1 25
7 4
19 3
4 11
2 20
6 8
6 20
1 25
7 4
19 3
4 11
2 20
6 8
6 51
1 19
4 16
1 28
5 9
1 29
16 0
輸出樣例:
0 0
0 1
1 1
問題解析
這個問題是關于判斷一支名為 DreamTear 的戰隊能否獲得兩項獎勵分,根據 Xepa Legends 游戲比賽的規則:
第一項獎勵分:如果隊伍在一輪比賽中獲得 50% 或以上場次的第一名,則獲得 1 分獎勵分
第二項獎勵分:如果隊伍的總得分領先第二名 50 分及以上,則獲得 1 分獎勵分
我們需要根據輸入的數據,判斷該戰隊是否能獲得這兩項獎勵分。
代碼實現思路
讀取測試數據組數 T
對每組數據:
讀取比賽場數 N 和第二名的總分 S
依次讀取每場比賽的排名 R 和得分 C
統計獲得第一名的場次(R=1)
計算總得分
判斷是否滿足兩項獎勵分條件:
第一項:第一名場次 ≥ 總場次的 50%(即 cnt×2 ≥ n)
第二項:總得分 - 第二名得分 ≥ 50(即 tot - s ≥ 50)
輸出判斷結果(1 表示能獲得,0 表示不能)
代碼說明
#include <bits/stdc++.h>
using namespace std;int main(){int T;cin>>T; // 讀取測試數據組數while(T--){int n,s;cin>>n>>s; // 讀取比賽場數和第二名總分int cnt=0,tot=0; // cnt統計第一名次數,tot統計總得分for(int i=0; i<n; i++){int r,c;cin>>r>>c;if(r==1) cnt++; // 如果是第一名,計數加1tot+=c; // 累加總得分}// 判斷并輸出結果// 第一項:cnt×2 >= n 等價于 cnt >= n/2// 第二項:總得分與第二名的差距是否>=50cout<<(cnt*2>=n)<<" "<<(tot-s>=50)<<endl;}return 0;
}
我的代碼通過簡單的計數和累加操作,就能高效地判斷兩個獎勵分條件是否滿足,時間復雜度為 O (T×N),完全符合題目的數據范圍要求。