é”Œē›®ēš„é›£åŗ¦é”č‰²ä½æē”Ø Luogu äøŠēš„åˆ†ē“šļ¼Œē”±ē°”å–®åˆ°å›°é›£åˆ†åˆ„ē‚ŗ šŸ”“šŸŸ šŸŸ”šŸŸ¢šŸ”µšŸŸ£āš«ć€‚

šŸ”— ABC437C Reindeer and Sleigh 2

rating: 546

Problem Statement

é”Œę„ē°”čæ°

꜉ NN 隻馓鹿,第 ii éš»é¦“é¹æēš„é«”é‡ē‚ŗ WiW_iļ¼ŒåŠ›é‡ē‚ŗ PiP_i怂
ęÆéš»é¦“é¹æåÆä»„éøę“‡ć€Œę‹‰é›Ŗę©‡ć€ęˆ–ć€Œåé›Ŗę©‡ć€ć€‚

é™åˆ¶ę¢ä»¶ļ¼šę‹‰é›Ŗę©‡ēš„é¦“é¹æēš„ēø½åŠ›é‡åæ…é ˆå¤§ę–¼ē­‰ę–¼åé›Ŗę©‡ēš„é¦“é¹æēš„ēø½é«”é‡ć€‚

č«‹å•ęœ€å¤šåÆä»„ęœ‰å¤šå°‘éš»é¦“é¹æåé›Ŗę©‡ļ¼Ÿ

Constraints

ē“„ęŸę¢ä»¶

  • 1≤N≤3Ɨ1051\leq N\leq 3\times 10^5
  • 1≤Wi,Pi≤1091\leq W_i,P_i\leq 10^9

ę€č·Æļ¼šäøē­‰å¼č½‰ę› + 貪心 (Greedy)

é€™é“é”Œē›®č¦ę±‚ęˆ‘å€‘å°‡ NN éš»é¦“é¹æåˆ†ē‚ŗå…©ēµ„ļ¼šę‹‰é›Ŗę©‡ēš„é›†åˆ SS å’Œåé›Ŗę©‡ēš„é›†åˆ RR怂
ē›®ęØ™ę˜Æęœ€å¤§åŒ–åé›Ŗę©‡ēš„ę•øé‡ ∣R∣|R|ļ¼Œäø”ę»æč¶³ę¢ä»¶ļ¼š

āˆ‘i∈SPiā‰„āˆ‘j∈RWj\sum_{i \in S} P_i \ge \sum_{j \in R} W_j

ē”±ę–¼ęÆéš»é¦“é¹æéžę­¤å³å½¼ļ¼Œå³ S∪R={1,2,…,N}S \cup R = \{1, 2, \dots, N\} äø” S∩R=āˆ…S \cap R = \emptysetļ¼Œęˆ‘å€‘åÆä»„åˆ©ē”Øēø½åŠ›é‡ āˆ‘k=1NPk\sum_{k=1}^N P_k ä¾†é€²č”Œä»£ę›ć€‚
ę‹‰é›Ŗę©‡ēš„ēø½åŠ›é‡åÆä»„č”Øē¤ŗē‚ŗć€Œå…Øé«”ēø½åŠ›é‡ć€ęø›åŽ»ć€Œåé›Ŗę©‡č€…ēš„åŠ›é‡ć€ļ¼š

āˆ‘i∈SPi=āˆ‘k=1NPkāˆ’āˆ‘j∈RPj\sum_{i \in S} P_i = \sum_{k=1}^N P_k - \sum_{j \in R} P_j

å°‡ę­¤å¼ä»£å›žåŽŸé™åˆ¶ę¢ä»¶ļ¼š

āˆ‘k=1NPkāˆ’āˆ‘j∈RPjā‰„āˆ‘j∈RWj\sum_{k=1}^N P_k - \sum_{j \in R} P_j \ge \sum_{j \in R} W_j

ē§»é …ę•“ē†å¾Œå¾—åˆ°ļ¼š

āˆ‘k=1NPkā‰„āˆ‘j∈RWj+āˆ‘j∈RPj\sum_{k=1}^N P_k \ge \sum_{j \in R} W_j + \sum_{j \in R} P_j

āˆ‘k=1NPkā‰„āˆ‘j∈R(Wj+Pj)\sum_{k=1}^N P_k \ge \sum_{j \in R} (W_j + P_j)

č²Ŗåæƒē­–ē•„

č§€åÆŸč½‰ę›å¾Œēš„äøē­‰å¼ļ¼š

  • 左邊 āˆ‘k=1NPk\sum_{k=1}^N P_k ę˜Æäø€å€‹å®šå€¼ļ¼ˆę‰€ęœ‰é¦“é¹æēš„åŠ›é‡ēø½å’Œļ¼‰ć€‚ęˆ‘å€‘åÆä»„å°‡å…¶č¦–ē‚ŗåˆå§‹ēš„ć€Œé ē®—ć€ć€‚
  • å³é‚Šę˜Æę‰€ęœ‰åé›Ŗę©‡é¦“é¹æēš„ (Wj+Pj)(W_j + P_j) ēø½å’Œć€‚ęˆ‘å€‘åÆä»„å°‡ Wj+PjW_j + P_j 視為讓第 jj éš»é¦“é¹æåé›Ŗę©‡ēš„ć€ŒčŠ±č²»ć€ć€‚

ē‚ŗäŗ†č®“ę›“å¤šé¦“é¹æåé›Ŗę©‡ļ¼ˆęœ€å¤§åŒ– ∣R∣|R|ļ¼‰ļ¼Œęˆ‘å€‘ę‡‰č©²å„Ŗå…ˆéøę“‡ć€ŒčŠ±č²»ć€ęœ€å°ēš„é¦“é¹æć€‚
å› ę­¤ļ¼Œč§£é”Œę­„é©Ÿå¦‚äø‹ļ¼š

  1. čØˆē®—ę‰€ęœ‰é¦“é¹æēš„åŠ›é‡ēø½å’Œä½œē‚ŗåˆå§‹é ē®—ć€‚
  2. čØˆē®—ęÆéš»é¦“é¹æēš„ä»£åƒ¹ Ci=Wi+PiC_i = W_i + P_i怂
  3. å°‡é¦“é¹æęŒ‰ē…§ CiC_i ē”±å°åˆ°å¤§ęŽ’åŗć€‚
  4. ä¾åŗéøå–é¦“é¹æé€²å…„é›†åˆ RRļ¼Œäø¦å¾žé ē®—äø­ę‰£é™¤å…¶ä»£åƒ¹ļ¼Œē›“åˆ°é ē®—äøč¶³ä»„ę”Æä»˜äø‹äø€éš»é¦“é¹æēš„ä»£åƒ¹ē‚ŗę­¢ć€‚
ē‚ŗä»€éŗ¼é€™ę˜Æę­£ē¢ŗēš„ļ¼Ÿ

ē”±ę–¼ęˆ‘å€‘åŖé—œåæƒć€Œę•øé‡ć€ļ¼Œč€Œäøé—œåæƒå…·é«”ę˜ÆčŖ°ļ¼Œę‰€ä»„åœØé ē®—ęœ‰é™ēš„ęƒ…ę³äø‹ļ¼ŒęÆę¬”éøęœ€ä¾æå®œēš„åæ…å®ščƒ½éøåˆ°ęœ€å¤šå€‹ć€‚

č¤‡é›œåŗ¦åˆ†ęž

  • ę™‚é–“č¤‡é›œåŗ¦ļ¼šäø»č¦ę¶ˆč€—åœØęŽ’åŗäøŠļ¼Œē‚ŗ O(Nlog⁔N)\mathcal{O}(N \log N)怂
  • ē©ŗé–“č¤‡é›œåŗ¦ļ¼šå„²å­˜é¦“é¹æč³‡ę–™ļ¼Œē‚ŗ O(N)\mathcal{O}(N)怂

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def solve():
n = int(input())
A = [tuple(map(int, input().split())) for _ in range(n)]

A.sort(key=lambda x: x[0] + x[1])
s = sum(p for w, p in A)

ans = 0
for w, p in A:
s -= (w + p)
if s < 0:
break
ans += 1
print(ans)

if __name__ == "__main__":
t = int(input())
for _ in range(t):
solve()