From 2da0a30789be511ac8d34a7c1677507443f2d9eb Mon Sep 17 00:00:00 2001 From: Facundo La Rocca Date: Wed, 10 Dec 2025 09:56:24 -0300 Subject: [PATCH 1/3] LeetCode: Max run time V1 --- src/algorithms/leet_code/max_run_time.rs | 435 +++++++++++++++++++++++ src/algorithms/leet_code/mod.rs | 1 + 2 files changed, 436 insertions(+) create mode 100644 src/algorithms/leet_code/max_run_time.rs diff --git a/src/algorithms/leet_code/max_run_time.rs b/src/algorithms/leet_code/max_run_time.rs new file mode 100644 index 0000000..18cd090 --- /dev/null +++ b/src/algorithms/leet_code/max_run_time.rs @@ -0,0 +1,435 @@ +pub struct Solution; + +impl Solution { + /// Maximum Running Time of N Computers + /// + /// You have `n` computers. You are given the integer `n` and a 0-indexed integer array `batterie`s where the `ith` + /// battery can run a computer for `batteries[i]` minutes. You are interested in running all `n` computers + /// simultaneously using the given batteries. + /// + /// Initially, you can insert at most one battery into each computer. After that and at any integer time moment, + /// you can remove a battery from a computer and insert another battery any number of times. The inserted battery + /// can be a totally new battery or a battery from another computer. You may assume that the removing and inserting + /// processes take no time. + /// + /// Note that the batteries cannot be recharged. + /// + /// Return the maximum number of minutes you can run all the n computers simultaneously. + pub fn max_run_time(n: i32, batteries: Vec) -> i64 { + let mut batteries = batteries; + batteries.sort_by(|a, b| b.cmp(a)); + + let mut minutes = 0; + let mut taken_slots = 0; + + loop { + // println!( + // "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", + // minutes, taken_slots, batteries + // ); + for battery_capacity in &mut batteries { + if *battery_capacity > 0 { + taken_slots += 1; + *battery_capacity -= 1; + } + + if taken_slots == n { + break; + } + } + + if taken_slots < n { + break; + } + + minutes += 1; + taken_slots = 0; + batteries.sort_by(|a, b| b.cmp(a)); + } + + // println!( + // "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", + // minutes, taken_slots, batteries + // ); + + minutes + } +} + +#[cfg(test)] +mod tests { + use std::time::Instant; + + use super::Solution; + use rstest::rstest; + + #[rstest] + #[case((2, vec![3, 3, 3]), 4)] + #[case((2, vec![1, 1, 1, 1]), 2)] + #[case((4, vec![2, 2, 2, 2, 2]), 2)] + #[case((1, vec![5, 5, 5]), 15)] + #[case((3, vec![1, 2, 3, 4, 5, 6]), 7)] + #[case((2, vec![3, 3, 3]), 4)] + #[case((2, vec![1, 1, 1, 1]), 2)] + #[case((1, vec![5]), 5)] + #[case((3, vec![10, 10, 3]), 3)] + #[case((2, vec![2, 2, 3]), 3)] + #[case((3, vec![3, 3, 3, 3]), 4)] + #[case((2, vec![100, 1, 1, 1]), 3)] // OK + #[case((3, vec![100, 1, 1, 1, 1, 1]), 2)] // OK + #[case((3, vec![100, 2, 1, 1, 1, 1]), 3)] // OK + fn test_max_run_time(#[case] (n, batteries): (i32, Vec), #[case] expected: i64) { + assert_eq!(Solution::max_run_time(n, batteries.to_vec()), expected); + } + + #[test] + fn test_debug() { + let n = 2; + let batteries = [3, 3, 3]; + let solution = Solution::max_run_time(n, batteries.to_vec()); + + println!("Solution: {solution:#?}"); + } + + #[test] + fn test_performance() { + let n = 904; + let batteries = [ + 630242, 432629, 302063, 19279, 47225, 445762, 906322, 782804, 437345, 580988, 85605, + 961059, 208297, 729706, 769613, 358351, 758719, 759354, 851360, 559870, 695388, 906871, + 794682, 113754, 925422, 113876, 691110, 683592, 310505, 384343, 979090, 180071, 718405, + 968414, 505206, 404072, 446902, 229783, 296581, 258819, 113325, 173769, 618352, 345195, + 96782, 93534, 113740, 998505, 48886, 858820, 573710, 220623, 743845, 848447, 213084, + 572423, 379351, 149018, 540848, 113286, 562719, 516440, 258935, 401058, 312982, 381222, + 891586, 992168, 626816, 731566, 30442, 974398, 170785, 803838, 416730, 46727, 965521, + 413289, 279484, 240904, 118823, 982615, 277618, 687198, 809169, 787106, 975685, 443037, + 313007, 285757, 363033, 411458, 325464, 720578, 640972, 664368, 746149, 337800, 499719, + 305755, 617431, 606006, 594809, 402669, 930529, 505891, 628371, 330292, 726360, 241785, + 540187, 329816, 516623, 481902, 571938, 125929, 842115, 551006, 687185, 51888, 218878, + 975907, 53165, 572638, 857616, 481379, 382547, 800414, 107748, 270280, 853469, 3184, + 48734, 424298, 476178, 212212, 747214, 395225, 347196, 557475, 812228, 505159, 577525, + 642875, 139271, 511329, 958349, 389524, 394117, 268713, 749397, 724176, 717271, 715590, + 914259, 537621, 260532, 3004, 41388, 972051, 501879, 342100, 250423, 563568, 908829, + 946868, 531301, 77559, 901800, 518058, 499491, 244028, 838004, 680926, 154662, 431928, + 328642, 559012, 373756, 657240, 1450, 5875, 631730, 843349, 867524, 654238, 312288, + 954831, 501945, 168432, 85808, 732242, 85179, 154920, 704708, 213338, 841105, 706595, + 563648, 15279, 99210, 396294, 80754, 174664, 232594, 75587, 93172, 268273, 71195, + 958818, 936820, 894645, 931030, 972581, 969958, 294377, 122716, 86905, 806182, 846379, + 913802, 423975, 817198, 37532, 741858, 607761, 641569, 598380, 197080, 526596, 200925, + 341281, 887577, 241107, 985017, 238211, 375357, 186910, 843660, 788496, 390170, 287820, + 303480, 800912, 188749, 502647, 770726, 23776, 313780, 119204, 1308, 383324, 980870, + 321965, 36725, 569678, 315042, 88710, 234513, 473792, 220116, 671196, 956612, 602579, + 382626, 178532, 449160, 788334, 888197, 371371, 687031, 740161, 837835, 966614, 892198, + 105901, 385393, 400885, 345119, 702639, 658666, 563285, 297363, 848248, 55221, 966241, + 623439, 275405, 232892, 567722, 70853, 467045, 237662, 583647, 825889, 748245, 448113, + 53484, 697495, 992252, 941287, 298571, 538776, 846660, 239763, 78440, 913086, 368102, + 756212, 951061, 796674, 299477, 800696, 724142, 309852, 294901, 606492, 302944, 481531, + 471864, 482551, 852580, 58523, 45779, 478603, 871233, 769184, 158656, 317491, 55966, + 702625, 238695, 803999, 719425, 214600, 426600, 473296, 144140, 149358, 39980, 737183, + 945048, 225162, 82662, 836928, 554168, 258668, 32847, 521113, 132721, 904989, 795129, + 759738, 315257, 826064, 247307, 613703, 503095, 73070, 513682, 67300, 432728, 459261, + 89652, 802436, 964846, 865737, 432130, 28542, 298085, 557043, 296084, 45209, 415240, + 204533, 498811, 695376, 841748, 300726, 803157, 58865, 984972, 738887, 659176, 765624, + 795323, 20092, 565119, 567473, 963696, 149595, 348735, 363135, 814509, 313379, 632223, + 525432, 954548, 189117, 898118, 338347, 5357, 768727, 630687, 596817, 698419, 978515, + 951417, 493252, 372600, 454112, 560392, 513507, 403932, 332090, 394447, 606318, 946535, + 272242, 634612, 296681, 388947, 670076, 99875, 126601, 569284, 638950, 245952, 213074, + 641239, 498203, 171712, 488737, 178518, 827383, 11438, 407054, 817133, 174697, 89467, + 679873, 742402, 363019, 499740, 336872, 415936, 272559, 198778, 374937, 904850, 838777, + 745993, 619060, 812928, 140616, 885008, 517718, 202578, 566168, 342148, 591112, 57986, + 736535, 43752, 521359, 307994, 247447, 302668, 196131, 49118, 418618, 35367, 758988, + 971464, 403372, 558301, 193438, 404213, 247991, 281501, 834477, 356671, 828997, 350068, + 906107, 509190, 930263, 832122, 168611, 634539, 692047, 679109, 896320, 642516, 171172, + 153691, 909759, 935680, 669415, 478827, 765755, 898956, 205967, 625772, 521567, 460376, + 905236, 658268, 1793, 241266, 466006, 320249, 354537, 781808, 120677, 604884, 365359, + 567, 511258, 571965, 147708, 618378, 963088, 258146, 740598, 118768, 542095, 488126, + 390475, 707282, 916467, 134464, 762691, 594035, 391933, 631282, 523892, 497861, 381394, + 880990, 181325, 445645, 863599, 885042, 107190, 165770, 44648, 982060, 242709, 980745, + 775595, 18065, 820755, 755751, 1441, 835920, 193248, 933274, 970383, 877073, 772148, + 953293, 215681, 744148, 656926, 594577, 593183, 497419, 476684, 621053, 55802, 366800, + 510315, 488179, 757390, 211832, 31350, 371121, 326166, 928772, 955764, 609441, 548939, + 808478, 11028, 484143, 844199, 541518, 402113, 733377, 115001, 348682, 416222, 927857, + 783357, 321269, 203170, 763450, 500002, 800515, 137108, 822311, 216603, 614219, 296108, + 568124, 450073, 769231, 835429, 55964, 452127, 370955, 637741, 892147, 646565, 140326, + 463132, 698852, 348339, 26185, 207356, 310431, 271379, 334497, 91618, 98778, 268818, + 764657, 149918, 56349, 418921, 186098, 257012, 816229, 673762, 757987, 363225, 236768, + 118964, 590865, 76108, 392949, 846861, 52940, 837478, 744567, 533259, 772768, 484615, + 665782, 943412, 187754, 743196, 578885, 133680, 502147, 398576, 730510, 412529, 647546, + 645034, 745145, 202742, 821979, 606655, 821170, 909333, 766691, 88142, 830074, 124942, + 460435, 977347, 126593, 622143, 285960, 242024, 559003, 202535, 398805, 818787, 94083, + 80297, 87525, 59892, 516487, 167560, 151615, 911121, 349298, 265644, 904739, 648797, + 55026, 37018, 255761, 788831, 179319, 654150, 944747, 709682, 463748, 784768, 424477, + 137204, 494360, 362735, 473972, 659287, 602628, 230971, 839013, 316618, 455912, 6195, + 307412, 327847, 707555, 724735, 603083, 966278, 300742, 687260, 3103, 895367, 613738, + 931689, 534567, 631758, 400970, 102397, 685592, 793145, 200863, 104839, 875592, 598258, + 669571, 327934, 149711, 868542, 827272, 182498, 69507, 809340, 606514, 411594, 256826, + 128058, 734273, 454229, 196081, 41642, 292948, 94361, 13997, 322441, 379213, 253524, + 247163, 422077, 192269, 480231, 37277, 320287, 77388, 848454, 308393, 439957, 951677, + 501904, 249488, 310824, 173774, 570491, 392942, 103371, 716313, 704752, 357167, 713999, + 215145, 943023, 569473, 278326, 655525, 881603, 46818, 329082, 707543, 860916, 526811, + 273726, 293084, 605608, 356433, 621605, 969366, 723138, 962457, 237480, 231138, 843224, + 912408, 248646, 827632, 805212, 414989, 204233, 441275, 395590, 910389, 172073, 560377, + 898792, 593423, 815436, 503817, 318730, 834602, 903983, 513188, 960094, 966050, 538683, + 238557, 629320, 837003, 791045, 911700, 887304, 7952, 44702, 776262, 137929, 126027, + 290153, 650348, 228570, 575282, 306288, 218227, 958772, 210022, 531396, 140136, 804637, + 642828, 7525, 184930, 61387, 588088, 396799, 526278, 454285, 448474, 839661, 488101, + 597830, 296764, 603067, 457691, 185570, 402236, 459909, 289234, 55162, 975582, 968496, + 326603, 799512, 802427, 728760, 637591, 168625, 420754, 963569, 461122, 756473, 306837, + 370914, 710398, 143696, 228442, 590766, 563145, 388307, 626395, 235409, 68241, 339034, + 884844, 880682, 629889, 707430, 272167, 656226, 579320, 472388, 53016, 656964, 633247, + 835904, 526603, 354328, 888094, 570093, 891716, 32839, 816508, 5467, 800069, 397722, + 111494, 298248, 69376, 506364, 737939, 157998, 224028, 921948, 999261, 897896, 386110, + 924793, 342466, 69694, 604998, 722368, 887538, 792423, 736329, 730955, 376661, 798648, + 934925, 461017, 838245, 415546, 480177, 70407, 225629, 597964, 243067, 90757, 359005, + 319023, 365780, 885098, 892286, 638094, 622735, 516943, 986095, 273352, 610420, 449633, + 856743, 232366, 353646, 30895, 392105, 609213, 636131, 353622, 696716, 563948, 496955, + 988484, 637749, 352352, 723728, 47340, 806811, 906810, 203695, 957278, 902822, 847879, + 288395, 906746, 133222, 678643, 882674, 481447, 242589, 318002, 185835, 226863, 805785, + 217790, 143999, 175583, 597059, 777727, 973149, 609179, 81693, 537574, 92049, 566795, + 847280, 898505, 83518, 536595, 798042, 931395, 690110, 713532, 362226, 458349, 264706, + 743616, 297050, 56389, 894221, 506820, 707980, 573451, 123052, 27713, 179437, 223005, + 600193, 851402, 289955, 816900, 376313, 29659, 119070, 120545, 572951, 180830, 381439, + 409332, 712627, 729104, 885931, 627970, 296987, 686389, 184518, 644096, 193474, 962505, + 331350, 650853, 416069, 443344, 776442, 808804, 388018, 398539, 133942, 122351, 50057, + 428196, 653518, 868281, 704447, 154430, 61838, 66404, 527248, 639152, 995360, 765440, + 996360, 85380, 395415, 181121, 143334, 534010, 327868, 87839, 768069, 212030, 986758, + 482373, 94545, 205379, 540785, 465693, 20097, 235387, 274164, 712255, 258920, 240995, + 106822, 183438, 386619, 320313, 186929, 172925, 957942, 479549, 517067, 933480, 437992, + 877390, 858236, 72995, 312108, 264068, 696321, 278317, 327492, 78072, 276604, 183085, + 226978, 775831, 630371, 228393, 933816, 273500, 62797, 867823, 813815, 323675, 798292, + 294400, 314744, 205371, 789614, 383379, 140909, 830784, 293175, 161475, 579922, 864449, + 895000, 148841, 635234, 105343, 200386, 647252, 357453, 724278, 139449, 768177, 49827, + 457393, 919553, 86442, 205799, 724481, 238451, 351998, 649691, 34479, 244539, 59389, + 906921, 453894, 686130, 714453, 733417, 240309, 721246, 80853, 466409, 894709, 618246, + 440919, 53811, 849595, 990830, 83601, 844122, 754002, 809684, 561850, 631569, 586549, + 181387, 545308, 983064, 374877, 733450, 825804, 256822, 452953, 561482, 98719, 944591, + 949312, 907765, 168047, 603245, 719668, 455000, 450092, 275745, 945044, 171542, 267344, + 864461, 592783, 645908, 721761, 347003, 910585, 312623, 359468, 599226, 309618, 956663, + 292386, 167138, 698708, 333032, 165192, 122520, 368898, 899039, 933107, 668812, 840199, + 585326, 526500, 43026, 304539, 173892, 892268, 42220, 866723, 770519, 953550, 212297, + 126884, 408826, 751960, 207039, 781089, 370085, 626817, 246513, 308790, 120967, 859257, + 745900, 221235, 430716, 900552, 9294, 21321, 988157, 581692, 560644, 231586, 436362, + 448518, 695816, 527288, 314527, 800515, 709279, 897548, 983730, 563067, 66158, 335844, + 133928, 961553, 128058, 55769, 527370, 388998, 392741, 397295, 616607, 910403, 321268, + 409989, 236788, 556875, 400795, 604600, 691606, 611557, 740939, 378160, 721532, 177926, + 593146, 786176, 427412, 220942, 130915, 657418, 448601, 542579, 885951, 221866, 849001, + 300662, 772347, 175151, 26295, 754250, 471971, 536033, 811870, 415233, 301710, 558944, + 568432, 238227, 734871, 821429, 135166, 213280, 154255, 78659, 673939, 976333, 873586, + 550568, 961856, 222309, 836314, 509849, 2005, 582921, 997752, 659430, 168796, 946109, + 322023, 347553, 435410, 667544, 718760, 216346, 66944, 69266, 127673, 592172, 756714, + 251625, 892794, 373265, 981202, 686572, 948385, 595486, 909746, 561682, 311662, 685072, + 645775, 946381, 806425, 867073, 367898, 238910, 445837, 285288, 628886, 314509, 334132, + 634891, 764891, 47704, 336211, 702378, 692170, 19536, 471839, 869012, 521128, 848245, + 669595, 271862, 607839, 987694, 157819, 620794, 168512, 63156, 37959, 964846, 777280, + 110580, 344003, 999006, 132517, 234650, 810963, 627352, 440214, 507333, 983130, 98661, + 584408, 756272, 186544, 630085, 670400, 701251, 795949, 114335, 640350, 567209, 389671, + 375571, 997227, 387900, 456596, 854695, 563211, 180121, 614718, 862138, 772255, 641667, + 252614, 210527, 480072, 417849, 626168, 549254, 19615, 729920, 743741, 840860, 194556, + 75472, 34849, 869238, 340478, 768395, 152129, 595169, 870477, 988789, 604187, 871281, + 232098, 40030, 128220, 617108, 975282, 640539, 290350, 277346, 550698, 742447, 587635, + 215815, 716193, 60441, 153879, 803031, 234763, 371610, 563538, 296953, 281259, 505282, + 725273, 957987, 777984, 870728, 960878, 945101, 484943, 281006, 186983, 967860, 620016, + 392947, 6897, 17871, 309806, 580541, 385508, 984980, 1055, 26104, 805428, 964452, + 320772, 318723, 868163, 602897, 518739, 148254, 107132, 500797, 703335, 117, 463231, + 626312, 1086, 60079, 849866, 138906, 252625, 772960, 286980, 355031, 539283, 552814, + 716244, 335647, 625508, 76136, 299217, 666660, 845130, 843593, 481723, 628470, 955691, + 958240, 515588, 304, 162874, 525992, 409088, 955013, 12747, 900178, 158223, 47951, + 736394, 378001, 179908, 129444, 831436, 320658, 318878, 4891, 152793, 809463, 265719, + 141577, 741249, 294617, 762744, 289513, 260346, 405593, 31673, 933245, 801644, 288054, + 59642, 285836, 430487, 342199, 941184, 132506, 41482, 77401, 897264, 657478, 21748, + 194274, 582900, 405950, 272609, 91643, 492650, 75616, 404672, 642592, 980800, 970579, + 39813, 493687, 904370, 111046, 619847, 412949, 904440, 168924, 900628, 895041, 855390, + 752736, 947413, 636786, 298823, 940266, 72059, 345344, 609978, 489938, 100223, 701134, + 15611, 27862, 980675, 62828, 946133, 589896, 90263, 878679, 510294, 547007, 258035, + 865896, 627345, 409809, 93079, 300303, 349290, 108224, 362573, 790879, 429011, 239909, + 713772, 403718, 286616, 266077, 753271, 860403, 807772, 733838, 598838, 151905, 88293, + 53734, 86323, 950101, 104491, 587463, 857741, 152781, 134036, 841250, 64278, 981751, + 778151, 362662, 402761, 258863, 943873, 325082, 508824, 874996, 729726, 232645, 756741, + 41961, 986834, 967893, 233502, 527938, 464013, 922592, 674389, 624298, 665655, 883869, + 155502, 864478, 499709, 24328, 250370, 219017, 956900, 359638, 771654, 261160, 916450, + 891210, 344444, 9611, 175248, 746616, 88432, 933392, 89056, 210607, 860486, 332899, + 915756, 132950, 531082, 86972, 72721, 937068, 998165, 543899, 280919, 435324, 877100, + 625787, 99340, 779729, 748226, 121099, 962352, 686851, 649653, 859710, 6323, 222122, + 97183, 444086, 269796, 148447, 13035, 624647, 677054, 239079, 654553, 815338, 286812, + 650141, 169493, 88849, 965062, 467364, 921371, 239377, 629420, 122390, 860624, 41919, + 720255, 944820, 892775, 478955, 873708, 875186, 822878, 698797, 209071, 676344, 275570, + 879905, 881347, 573089, 82531, 865661, 490293, 541803, 187725, 567119, 735833, 492213, + 209683, 999702, 108186, 77508, 739426, 612897, 239701, 186740, 366719, 900791, 426287, + 791230, 59536, 674251, 755825, 797649, 982129, 765660, 186858, 987803, 414160, 214646, + 292772, 163454, 300920, 467171, 568278, 502875, 748037, 296600, 407985, 76990, 849852, + 677509, 664423, 957292, 552101, 490395, 851242, 108688, 964200, 159676, 665349, 898847, + 565773, 215104, 368356, 387308, 429666, 344941, 460842, 994942, 316357, 519486, 113116, + 375784, 534717, 727860, 730486, 297757, 680713, 270689, 591959, 624924, 737285, 636169, + 40718, 905833, 544489, 7709, 181736, 225106, 742400, 182004, 585091, 410855, 442742, + 227946, 812631, 255571, 916380, 970362, 69545, 344502, 810092, 39872, 931827, 883909, + 121273, 360448, 773614, 569363, 210780, 696281, 283935, 979081, 635548, 870817, 50393, + 663528, 286707, 802699, 843521, 338631, 435924, 125494, 217426, 384698, 398228, 586707, + 693632, 174003, 746940, 872656, 297885, 938586, 320972, 532848, 336568, 798329, 269023, + 304348, 757083, 138381, 303536, 32762, 469552, 910682, 964510, 510146, 824946, 50393, + 402569, 749254, 807274, 989, 950968, 953530, 409839, 718897, 931323, 623190, 587538, + 288710, 538545, 836634, 123764, 269570, 726622, 341695, 52951, 641986, 825795, 357998, + 967349, 635650, 950636, 267827, 947794, 369889, 963528, 838942, 491642, 416993, 246862, + 459149, 98887, 395091, 611814, 495420, 704430, 516504, 719082, 963618, 527967, 279749, + 133958, 694026, 294384, 836034, 893190, 369115, 760018, 614672, 124530, 918599, 488357, + 769309, 984948, 251567, 296074, 464435, 457762, 795377, 3407, 157114, 358607, 346657, + 697044, 818222, 6721, 407299, 49251, 945061, 419018, 917892, 242345, 685772, 871392, + 557663, 251361, 73583, 258048, 117722, 316724, 417509, 145546, 440649, 760929, 332379, + 955789, 277989, 520712, 418750, 804360, 393934, 446464, 454770, 634131, 630184, 625531, + 784319, 143685, 863933, 9084, 748252, 451967, 559457, 979357, 605541, 194198, 691890, + 169398, 974813, 61842, 972312, 973933, 801336, 436734, 828930, 225134, 385258, 933435, + 21092, 686125, 615625, 738326, 591240, 211541, 486290, 308412, 316435, 796285, 540204, + 124451, 933683, 495529, 405025, 49285, 48879, 98250, 713444, 456011, 445572, 287074, + 374370, 728506, 508802, 618363, 947734, 934537, 962712, 588798, 13034, 173582, 597556, + 342804, 501257, 271803, 100810, 170449, 754303, 1960, 945777, 989525, 333752, 217287, + 558334, 320283, 677410, 963982, 952084, 612770, 145876, 191612, 265373, 27493, 852352, + 289479, 982795, 234071, 521930, 120553, 824398, 313758, 734567, 360772, 577180, 215603, + 192965, 608640, 826843, 489825, 159068, 776588, 41460, 183283, 519058, 227288, 810359, + 587051, 36375, 377072, 296833, 871035, 240507, 963050, 641088, 765752, 87600, 109763, + 195353, 905560, 434645, 294378, 974363, 595518, 230198, 734043, 422510, 407177, 700470, + 92109, 197825, 279736, 459080, 314836, 359526, 47938, 492166, 189824, 823275, 468195, + 834476, 328780, 671683, 84392, 463256, 213546, 209042, 46180, 114875, 893304, 413990, + 507554, 437242, 398909, 67532, 604495, 673903, 604146, 887660, 852193, 850336, 870766, + 559732, 896741, 844135, 923279, 125896, 559295, 231099, 852026, 21117, 264333, 577348, + 366985, 945918, 262635, 484443, 796066, 457488, 196567, 698178, 897164, 555372, 599505, + 689368, 6687, 408580, 360016, 735727, 521244, 516884, 498307, 250837, 397881, 832495, + 42218, 779873, 323314, 38706, 575338, 988288, 690121, 102228, 984997, 363192, 31540, + 507339, 258903, 679131, 382645, 799489, 183112, 518963, 662776, 683097, 470049, 592213, + 793453, 473659, 315610, 787260, 594265, 416444, 981741, 791220, 884895, 483717, 469143, + 157029, 802975, 768969, 564756, 275231, 398309, 916777, 506068, 977746, 824847, 716682, + 781033, 285810, 942211, 476034, 702053, 330102, 978045, 548892, 145577, 716837, 357867, + 197307, 322335, 12880, 544217, 525956, 38965, 812143, 329572, 279938, 791080, 637908, + 87410, 632485, 285862, 629409, 524522, 304512, 864168, 791614, 1323, 884274, 961286, + 426882, 436051, 925940, 700450, 356073, 415507, 514326, 98619, 641006, 983209, 169456, + 925132, 175148, 535130, 802224, 913126, 366913, 566295, 237099, 198732, 515896, 139387, + 863721, 418416, 855930, 401813, 127866, 513814, 236622, 11780, 160058, 658140, 903635, + 998978, 706556, 102817, 814292, 645427, 754476, 442144, 619356, 448518, 890279, 153547, + 81180, 855292, 960834, 504409, 512886, 994636, 901320, 549661, 167672, 883255, 260295, + 49097, 710018, 395934, 207144, 606405, 406693, 492527, 527027, 916627, 995787, 812668, + 636, 325889, 903249, 812379, 538260, 404910, 250439, 990227, 387111, 954774, 310191, + 22882, 602720, 33621, 395715, 520214, 512951, 652765, 593058, 996052, 570271, 12035, + 470383, 887900, 646527, 998622, 324255, 212542, 10122, 914097, 67076, 845979, 904899, + 737647, 208367, 139522, 957092, 405032, 773237, 789524, 344700, 737068, 274108, 985644, + 140327, 35863, 373104, 541196, 503438, 251025, 389145, 338240, 454775, 288353, 932588, + 339952, 816195, 447195, 219067, 765823, 320400, 325433, 370726, 769965, 860320, 867947, + 937850, 283710, 681978, 252001, 313944, 23722, 944584, 348098, 256676, 370488, 935454, + 284584, 215828, 926217, 644278, 213425, 366263, 748821, 305841, 827337, 229374, 30762, + 758595, 276921, 831126, 930661, 974157, 573977, 427523, 376506, 966617, 641764, 325496, + 820500, 934351, 870852, 222691, 688254, 914200, 316783, 480159, 925328, 148326, 865089, + 88152, 537842, 137323, 766328, 638906, 373367, 748743, 213306, 210293, 956775, 669405, + 379950, 494979, 151952, 305946, 444710, 401226, 107785, 152987, 369875, 261668, 33763, + 717760, 622799, 918009, 991014, 130085, 520813, 792193, 515232, 183277, 588439, 890301, + 416751, 377322, 390255, 112694, 876740, 418282, 533319, 595311, 245918, 47622, 673820, + 494893, 813928, 324730, 966373, 102262, 524076, 271172, 292927, 150884, 951700, 804248, + 12795, 941436, 574868, 544543, 955958, 925044, 334509, 420881, 655061, 428126, 777833, + 121611, 520825, 631996, 490229, 930217, 895595, 93045, 414204, 568862, 811567, 244917, + 536817, 61713, 255143, 18987, 402643, 161281, 616280, 762172, 124933, 308824, 62405, + 1421, 207860, 804997, 306530, 45094, 573885, 726185, 876394, 550318, 40031, 563780, + 240186, 463679, 391233, 87677, 142708, 661190, 775404, 345165, 348716, 585080, 459545, + 670369, 175578, 998459, 855579, 279506, 131672, 423779, 60522, 762361, 131808, 442875, + 467830, 64097, 161271, 755945, 647927, 843093, 257295, 24715, 210100, 632536, 671032, + 408327, 88587, 59520, 41854, 520406, 255644, 566343, 761220, 641340, 778765, 585793, + 421304, 826910, 313653, 211611, 383877, 524765, 157287, 829231, 843103, 111326, 563576, + 641288, 310162, 184062, 120557, 268779, 220915, 318479, 813564, 746580, 568813, 743872, + 522788, 98075, 644781, 53377, 646242, 711597, 998038, 101558, 661937, 169232, 772542, + 977499, 567329, 432519, 686657, 111531, 541037, 34169, 52863, 922054, 315624, 10891, + 103, 564840, 836608, 153089, 582531, 120982, 839970, 810335, 906793, 887748, 948620, + 442070, 129392, 200074, 902388, 495233, 190495, 783449, 226296, 12580, 101895, 235172, + 415222, 613045, 784060, 444804, 139817, 242519, 852163, 264056, 692699, 641168, 161971, + 305197, 422189, 173927, 564461, 315135, 535449, 811627, 956052, 209795, 132866, 572380, + 196848, 841475, 706861, 832567, 663246, 904211, 528066, 947405, 56158, 643484, 700600, + 401473, 703474, 471931, 420689, 560730, 129697, 369753, 430985, 403426, 180739, 65353, + 840493, 505061, 987135, 366152, 71441, 293592, 264296, 848408, 191805, 760159, 419357, + 647993, 435114, 115389, 343150, 891311, 352407, 694194, 914268, 585796, 979343, 193166, + 584254, 854117, 73910, 620327, 188556, 482611, 370038, 725327, 263412, 939847, 810048, + 64028, 483943, 142215, 721987, 342736, 351723, 403932, 16637, 430168, 148896, 433943, + 49708, 421726, 398785, 889793, 332228, 516133, 772402, 289165, 522733, 248262, 920352, + 273742, 376575, 959811, 307751, 647150, 151977, 377056, 37663, 614276, 809514, 607709, + 561027, 275567, 346096, 691667, 964445, 574334, 434582, 267380, 983617, 62206, 302669, + 951531, 505778, 614020, 383570, 343401, 9869, 377751, 357968, 796997, 440873, 919525, + 510452, 830366, 913259, 282922, 486292, 196065, 350546, 667783, 946363, 59177, 740548, + 222326, 377239, 215415, 273653, 339465, 462831, 79199, 839524, 136609, 214231, 742366, + 556278, 787113, 475735, 973843, 859247, 542745, 465482, 277747, 996410, 85589, 121578, + 813935, 332650, 572352, 944062, 304150, 201593, 751825, 652824, 896906, 415509, 167692, + 735655, 14249, 108238, 534246, 227788, 785403, 170915, 728257, 733376, 807822, 831920, + 950192, 795322, 499586, 917187, 705450, 273086, 637709, 789984, 750779, 65103, 644165, + 183346, 668179, 518543, 29523, 158428, 973988, 498005, 396404, 756356, 175238, 296889, + 93828, 980014, 239321, 68230, 18018, 702129, 127819, 85179, 296624, 994007, 672433, + 244999, 571539, 953831, 930007, 895825, 974693, 323083, 436460, 99514, 823313, 435923, + 358120, 525533, 678852, 777439, 989125, 246539, 929427, 183652, 485196, 87301, 655625, + 302080, 995580, 500451, 754411, 285328, 314189, 391583, 813404, 770383, 324943, 568136, + 320832, 13433, 702612, 798734, 726739, 896658, 180897, 951526, 228879, 907804, 50067, + 412586, 989301, 359260, 412813, 949899, 504320, 245607, 521518, 637194, 419342, 480557, + 46344, 717604, 234965, 794294, 10351, 691009, 510673, 625949, 636834, 714762, 121037, + 159601, 177301, 529714, 418767, 315979, 765737, 966800, 777662, 959074, 663621, 787398, + 898402, 749488, 239110, 887882, 371432, 556981, 446591, 68531, 941519, 331951, 946419, + 882976, 724370, 791315, 659631, 46587, 944016, 83568, 923168, 647624, 38252, 766545, + 458567, 786027, 868331, 739227, 799096, 234717, 929907, 392081, 572624, 540814, 576322, + 659483, 987009, 484501, 152851, 546687, 39446, 543112, 710584, 422942, 223784, 760970, + 533383, 485070, 420468, 724957, 414582, 113704, 135499, 701001, 284009, 990532, 312283, + 497186, 716375, 650748, 225062, 269271, 48958, 840044, 829882, 892043, 134457, 860426, + 837775, 975339, 903830, 51398, 989755, 807198, 435666, 41959, 407631, 153671, 49846, + 500502, 951560, 400019, 437367, 148937, 29661, 337942, 556369, 391084, 876681, 6072, + 469802, 847875, 187926, 315462, 248657, 270899, 291197, 284096, 346653, 888673, 72658, + 396683, 606130, 406477, 472506, 718119, 603442, 262806, 957720, 241515, 294919, 894084, + 897195, 242331, 754687, 881095, 7829, 296407, 529267, 828629, 629475, 247444, 656867, + 771849, 743039, 511278, 736099, 581925, 521649, 965093, 664130, 857309, 93644, 335719, + 746102, 252741, 976333, 346612, 963082, 269117, 251973, 813011, 427478, 200869, 940552, + 528552, 669469, 834647, 362444, 220989, 559360, 711762, 998597, 551793, 684941, 275900, + 897025, 508713, 849438, 980277, 419553, 118210, 70082, 89584, 254181, 750086, 366607, + 31349, 485955, 287760, 450918, 324109, 112559, 853694, 626137, 635408, 322805, 667002, + 589093, 841570, 3929, 273935, 773765, 702289, 94086, 621142, 2766, 892684, 68896, + 299438, 299605, 269557, 881781, 739189, 294161, 971180, 857809, 146081, 499918, 67382, + 210611, 822916, 214113, 40899, 236583, 240489, 695716, 380837, 296045, 969085, 817298, + 510113, 822782, 810743, 572401, 777681, 230877, 113895, 820252, 520416, 141386, 972690, + 819170, 953318, 809082, 587527, 742690, 14006, 902997, 73127, 771924, 553975, 905688, + 843689, 47859, 896714, 782565, 837041, 263235, 921701, 522369, 71214, 169731, 260226, + 195580, 450289, 94227, 470815, 417208, 369790, 458187, 609020, 92490, 401955, 951436, + 386957, 229642, 410605, 276297, 723913, 820486, 609055, 600632, 629923, 533415, 642352, + 509222, 858811, 80296, 578520, 824244, 940586, 602220, 537008, 915870, 562517, 850596, + 72619, 893440, 683034, 521949, 812062, 267937, 950421, 576535, 970708, 923234, 164326, + 186784, 849285, 124222, 895662, 834887, 905223, 12521, 675244, 641216, 676611, 630154, + 374353, 938146, 266828, 29038, 428005, 27300, 40639, 400664, 990182, 877260, 491015, + 679994, 25966, 934586, 579971, 282769, 630418, 623813, 395247, 747734, 52023, 318329, + 180333, 342037, 698531, 182222, 548503, 185977, 83340, 35020, 93017, 80238, 355772, + 179330, 587174, 310154, 986811, 538946, 633979, 472930, 594275, 528679, 725782, 131051, + 715792, 609829, 74565, 91303, 306568, 109334, 994690, 75141, 937915, 437728, 758471, + 568356, 747917, 979713, 369738, 1239, 291862, 987615, 262291, 297813, 536716, 724457, + 344762, 159188, 128952, 796705, 511440, 26762, 817499, 693610, 995490, 627415, 600125, + 936779, 44467, 661264, 372413, 287411, 483422, 930187, 874969, 665203, 451184, 409471, + 251534, 330632, 621885, 131882, 347152, 106311, 33915, 435613, 691399, 73955, 3262, + 488440, 790966, 346686, 626361, 141891, 348669, 971599, 795644, 522796, 167946, 388679, + 981428, 444312, 167604, 347596, 488654, 176887, 458681, 892548, 739905, 110710, 671466, + 199003, 639332, 125350, 279723, 823952, 790784, 400718, 503989, 75210, 314599, 121568, + 471840, 645712, 590989, 822455, 318918, 210421, 64471, 931138, 60815, 731977, 175090, + 342754, 455275, 807943, 835785, 348424, 800496, 936996, 347027, 605836, 428503, 160857, + 879738, 518491, 296755, 330786, 574233, 18018, 298544, 56045, 516648, 70021, 171272, + 478804, 619933, 15479, 81235, 854498, 214972, 230620, 710274, 311701, 866154, 942900, + 18092, 684237, 142518, 588496, 244267, 657969, 987451, 561970, 705747, 688417, 197633, + 291031, 31602, 781204, 722323, 541249, 463032, 880701, 753116, 828314, 451333, 502783, + 811132, 112559, 685765, 990623, 935465, 286031, 152821, 263546, 564051, 768686, 263448, + 613448, 196315, 78177, 786548, 626845, 999103, 712042, 255750, 586897, 622920, 343107, + 337497, 893078, 935072, 315309, 963781, 384459, 301248, 139583, 313961, 153793, 306534, + 17731, 951402, 650566, 729057, 797647, 917637, 492032, 721355, 159504, 972322, 133188, + 448912, 75129, 311766, 141023, 841442, 509801, 847805, 349099, 751683, 510373, 571212, + 476916, 470007, 536269, 78354, 694706, 372303, 684008, 135655, 909702, 351070, 166696, + 975404, 216458, 173593, 259943, 53931, 625192, 193976, 737463, 332892, 741078, 306387, + 622790, 103840, 65034, 852692, 169851, 920092, 287430, 976576, 861589, 211609, 108060, + 41743, 756035, 398325, 657702, 247666, 794282, 62426, 857321, 752806, 77799, 901844, + 993771, 278551, 611927, 254914, 442308, 263242, 988736, 962726, 909051, 528064, 984778, + 544557, 707277, 544836, 501845, 928428, 126356, 671306, 410974, 291170, 247139, 471917, + 748659, 177220, 781515, 474847, 280336, 616887, 532336, 941633, 127957, 758333, 533231, + 280149, 561603, 733797, 273516, 989243, 40250, 826926, 41057, 482503, 377122, 462052, + 249214, 932118, 359987, 759539, 403553, 378423, 719269, 860058, 368505, 866286, 505497, + 454955, 621160, 313906, 531174, 172117, 369335, 962204, + ]; + + let start = Instant::now(); + + let solution = Solution::max_run_time(n, batteries.to_vec()); + + let elapsed = start.elapsed(); + + println!("Result: {solution:?}"); + println!("Elapsed: {:?}", elapsed); + } +} diff --git a/src/algorithms/leet_code/mod.rs b/src/algorithms/leet_code/mod.rs index 60784c7..01b90df 100644 --- a/src/algorithms/leet_code/mod.rs +++ b/src/algorithms/leet_code/mod.rs @@ -1,2 +1,3 @@ pub mod count_collisions; pub mod count_partitions; +pub mod max_run_time; From 0d4aa0fec3ee0e1539631ba5a351af50855fa72a Mon Sep 17 00:00:00 2001 From: Facundo La Rocca Date: Tue, 16 Dec 2025 11:58:46 -0300 Subject: [PATCH 2/3] WIP --- src/algorithms/leet_code/max_run_time.rs | 114 +++++++++++++++++++---- 1 file changed, 96 insertions(+), 18 deletions(-) diff --git a/src/algorithms/leet_code/max_run_time.rs b/src/algorithms/leet_code/max_run_time.rs index 18cd090..66535fa 100644 --- a/src/algorithms/leet_code/max_run_time.rs +++ b/src/algorithms/leet_code/max_run_time.rs @@ -23,14 +23,21 @@ impl Solution { let mut taken_slots = 0; loop { - // println!( - // "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", - // minutes, taken_slots, batteries - // ); - for battery_capacity in &mut batteries { - if *battery_capacity > 0 { + println!( + "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", + minutes, taken_slots, batteries + ); + let index_of_max = Self::index_of_max(&batteries); + let Some(index_to_consume) = + Self::get_slots_to_consume(n as usize, index_of_max, &batteries) + else { + break; + }; + + for i in index_to_consume { + if batteries[i] > 0 { taken_slots += 1; - *battery_capacity -= 1; + batteries[i] -= 1; } if taken_slots == n { @@ -44,16 +51,57 @@ impl Solution { minutes += 1; taken_slots = 0; - batteries.sort_by(|a, b| b.cmp(a)); } - // println!( - // "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", - // minutes, taken_slots, batteries - // ); + println!( + "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", + minutes, taken_slots, batteries + ); minutes } + + fn index_of_max(batteries: &[i32]) -> usize { + let mut max_index = 0; + let mut max_capacity = 0; + + for (i, capacity) in batteries.iter().enumerate() { + if *capacity > max_capacity { + max_capacity = *capacity; + max_index = i; + } + } + + max_index + } + + fn get_slots_to_consume(slots: usize, start: usize, batteries: &[i32]) -> Option> { + let mut i = start; + let mut slots_taken = 0; + let mut result = Vec::with_capacity(slots); + + while slots_taken < slots { + if batteries[i] != 0 { + result.push(i); + slots_taken += 1; + } + i += 1; + + if i > batteries.len() - 1 { + i = 0; + } + + if i == start { + break; + } + } + + if slots_taken == slots { + Some(result) + } else { + None + } + } } #[cfg(test)] @@ -75,23 +123,28 @@ mod tests { #[case((3, vec![10, 10, 3]), 3)] #[case((2, vec![2, 2, 3]), 3)] #[case((3, vec![3, 3, 3, 3]), 4)] - #[case((2, vec![100, 1, 1, 1]), 3)] // OK - #[case((3, vec![100, 1, 1, 1, 1, 1]), 2)] // OK - #[case((3, vec![100, 2, 1, 1, 1, 1]), 3)] // OK + #[case((2, vec![100, 1, 1, 1]), 3)] + #[case((3, vec![100, 1, 1, 1, 1, 1]), 2)] + #[case((3, vec![100, 2, 1, 1, 1, 1]), 3)] + #[case((12, vec![11,89,16,32,70,67,35,35,31,24,41,29,6,53,78,83]), 43)] fn test_max_run_time(#[case] (n, batteries): (i32, Vec), #[case] expected: i64) { assert_eq!(Solution::max_run_time(n, batteries.to_vec()), expected); } #[test] fn test_debug() { - let n = 2; - let batteries = [3, 3, 3]; + let expected = 43; + let n = 12; + let batteries = [ + 11, 89, 16, 32, 70, 67, 35, 35, 31, 24, 41, 29, 6, 53, 78, 83, + ]; let solution = Solution::max_run_time(n, batteries.to_vec()); - println!("Solution: {solution:#?}"); + println!("Solution: {solution:#?} - Expected: {expected:#?}"); } #[test] + #[ignore] fn test_performance() { let n = 904; let batteries = [ @@ -432,4 +485,29 @@ mod tests { println!("Result: {solution:?}"); println!("Elapsed: {:?}", elapsed); } + + #[rstest] + #[case((2, 0, vec![3, 3, 3]), Some(vec![0, 1]))] + #[case((2, 1, vec![2, 2, 3]), Some(vec![1, 2]))] + #[case((2, 2, vec![2, 2, 3]), Some(vec![2, 0]))] + #[case((2, 2, vec![0, 2, 3]), Some(vec![2, 1]))] + #[case((3, 2, vec![2, 0, 0]), None)] + fn test_slots_to_consume( + #[case] (slots, start, batteries): (usize, usize, Vec), + #[case] expected: Option>, + ) { + assert_eq!( + Solution::get_slots_to_consume(slots, start, &batteries), + expected + ); + } + + #[rstest] + #[case(&[0, 1], 1)] + #[case(&[0, 1, 2, 3], 3)] + #[case(&[2, 2, 3], 2)] + #[case(&[0, 2, 1], 1)] + fn test_index_of_max(#[case] batteries: &[i32], #[case] expected: usize) { + assert_eq!(Solution::index_of_max(batteries), expected); + } } From b490dbe2b74f00effac4e1bf986f81dcf1ee1a41 Mon Sep 17 00:00:00 2001 From: Facundo La Rocca Date: Tue, 23 Dec 2025 13:17:22 -0300 Subject: [PATCH 3/3] WIP --- src/algorithms/leet_code/max_run_time.rs | 91 ++++-------------------- 1 file changed, 14 insertions(+), 77 deletions(-) diff --git a/src/algorithms/leet_code/max_run_time.rs b/src/algorithms/leet_code/max_run_time.rs index 66535fa..0fc6123 100644 --- a/src/algorithms/leet_code/max_run_time.rs +++ b/src/algorithms/leet_code/max_run_time.rs @@ -16,91 +16,27 @@ impl Solution { /// /// Return the maximum number of minutes you can run all the n computers simultaneously. pub fn max_run_time(n: i32, batteries: Vec) -> i64 { + let mut total_minutes = 0; let mut batteries = batteries; - batteries.sort_by(|a, b| b.cmp(a)); - - let mut minutes = 0; - let mut taken_slots = 0; + batteries.sort(); + let available_batteries = batteries.len() as i32; loop { - println!( - "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", - minutes, taken_slots, batteries - ); - let index_of_max = Self::index_of_max(&batteries); - let Some(index_to_consume) = - Self::get_slots_to_consume(n as usize, index_of_max, &batteries) - else { + if available_batteries < n { break; - }; - - for i in index_to_consume { - if batteries[i] > 0 { - taken_slots += 1; - batteries[i] -= 1; - } - - if taken_slots == n { - break; - } - } - - if taken_slots < n { - break; - } - - minutes += 1; - taken_slots = 0; - } - - println!( - "Minutes: {:#?} - Taken Slots: {:#?} - Batteries: {:?}", - minutes, taken_slots, batteries - ); - - minutes - } - - fn index_of_max(batteries: &[i32]) -> usize { - let mut max_index = 0; - let mut max_capacity = 0; - - for (i, capacity) in batteries.iter().enumerate() { - if *capacity > max_capacity { - max_capacity = *capacity; - max_index = i; } } - max_index - } - - fn get_slots_to_consume(slots: usize, start: usize, batteries: &[i32]) -> Option> { - let mut i = start; - let mut slots_taken = 0; - let mut result = Vec::with_capacity(slots); + total_minutes - while slots_taken < slots { - if batteries[i] != 0 { - result.push(i); - slots_taken += 1; - } - i += 1; - - if i > batteries.len() - 1 { - i = 0; - } - - if i == start { - break; - } - } - - if slots_taken == slots { - Some(result) - } else { - None - } + // n = 3 + // batteries = [6, 5, 4, 3, 2] + // [6, 5, 4] -> [5, 4, 3] = 1 >> [5, 4, 3, 3, 2] + // [5, 4, 3] -> [4, 3, 2] = 2 >> [4, 3, 2, 3, 2] -> [4, 3, 3, 2, 2] + // [4, 3, 3] -> [3, 2, 2] = 3 >> [3, 2, 2, 2, 2] + // [3, 2, 2] -> [2, 1, 1] = 4 >> [2, 1, 1, 2, 2] -> [2, 2, 2, 1, 1] + // [2, 2, 2] -> [1, 1, 1] = 5 >> [1, 1, 1, 1, 1] + // [1, 1, 1] -> [0, 0, 0] = 6 >> [0, 0, 0, 1, 1] } } @@ -135,6 +71,7 @@ mod tests { fn test_debug() { let expected = 43; let n = 12; + // batteries = 16 let batteries = [ 11, 89, 16, 32, 70, 67, 35, 35, 31, 24, 41, 29, 6, 53, 78, 83, ];