give python code for Here’s a **complete English e...
Created on: May 8, 2025
Created on: May 8, 2025
give python code for Here’s a complete English explanation of the problem "Esm Famil" (اسم فامیل) from CodeCup 3, including the objective, input/output format, and examples.
Esm Famil (translated as "Name Game")
You are given two sequences of natural numbers a
and b
, each of length n
.
Each element in sequence a
is denoted as a[i]
and in sequence b
as b[i]
.
Define the function:
f(a, b)
as:The number of distinct ordered pairs (a[i], b[i])
for all valid indices i
.
An ordered pair
(x, y)
is distinct from another pair(u, v)
if:
x != u
ory != v
Your task is to reorder the elements of sequence b
in any way you like, to maximize the value of f(a, b)
.
n
— the length of both sequences a
and b
.n
space-separated integers — the elements of sequence a
.n
space-separated integers — the elements of sequence b
.text1 ≤ n ≤ 200,000 1 ≤ a[i], b[i] ≤ 200,000
Print a single integer — the maximum value of f(a, b)
after reordering b
.
textInput: 5 3 2 2 2 3 1 1 5 2 2 Output: 5
Explanation:
You can rearrange b
to match the same values of a
where possible.
Possible pairing:
(3,1), (2,1), (2,5), (2,2), (3,2)
All 5 are unique → Output is 5.
textInput: 5 1 2 1 2 1 4 2 4 2 4 Output: 4
Explanation:
The best we can do is:
(1,4), (2,2), (1,4), (2,2), (1,4)
But (1,4)
and (2,2)
repeat, so only 2 unique pairs.
We can instead arrange to get:
(1,4), (2,2), (1,2), (2,4), (1,4)
Now the 4 unique ones could be:
So the output is 4.
Choose an order for b
such that the number of distinct pairs (a[i], b[i])
is maximized.
You need to:
a
and b
.b
values to a
values to form unique (a[i], b[i])
pairs.Would you like a visual explanation or diagram to go along with this?
pythonfrom collections import Counter, defaultdict, deque def max_distinct_pairs(a,b): n=len(a) ca=Counter(a) cb=Counter(b) A=len(ca) B=len(cb) s1=sum(min(cnt,B) for cnt in ca.values()) s2=sum(min(cnt,A) for cnt in cb.values()) return min(n,s1,s2) print(max_distinct_pairs([3,2,2,2,3],[1,1,5,2,2])) print(max_distinct_pairs([1,2,1,2,1],[4,2,4,2,4]))
Here’s a compact, contest-ready Python 3 solution that reads the input, applies the formula described in the English explanation you provided, and prints the maximum possible number of distinct pairs (a[i], b[i])
.
python#!/usr/bin/env python3 """ CodeCup 3 – “Esm Famil” (اسم فامیل) Objective --------- Given two integer sequences `a` and `b` of equal length `n`, you may re-order `b` arbitrarily. After the reordering, let `f(a, b)` be the count of *distinct* ordered pairs `(a[i], b[i])`. Compute the largest value of `f(a, b)` that can be achieved. Key fact used ------------- Let A = number of distinct values in `a` B = number of distinct values in `b` cntA[x] = occurrences of value x in a cntB[y] = occurrences of value y in b For any arrangement: * Each value `x` in `a` can appear in at most `B` different pairs (there are only `B` distinct right-hand values). * Each value `y` in `b` can appear in at most `A` different pairs. * Obviously, no more than `n` pairs can be formed. Therefore answer = min( n, Σ_x min(cntA[x], B), Σ_y min(cntB[y], A) ) This bound is tight and can be attained with a simple constructive assignment, so the formula gives the maximum. Complexities ------------ * Time: **O(n)** (one pass to count, one pass to sum) * Memory: **O(A + B)** counters only Input / output format exactly matches the statement. """ import sys from collections import Counter def max_distinct_pairs(a, b): """Return the maximum possible f(a, b) after reordering b.""" n = len(a) cntA = Counter(a) cntB = Counter(b) A = len(cntA) B = len(cntB) s1 = sum(min(c, B) for c in cntA.values()) # per-a-value limit s2 = sum(min(c, A) for c in cntB.values()) # per-b-value limit return min(n, s1, s2) def main() -> None: data = sys.stdin.buffer.read().split() if not data: # empty input guard return n = int(data[0]) a = list(map(int, data[1 : 1 + n])) b = list(map(int, data[1 + n : 1 + 2*n])) print(max_distinct_pairs(a, b)) if __name__ == "__main__": main()
Example | Computed components | Result |
---|---|---|
1 | A = 2 , B = 3 , Σ_x min(cntA[x], B)=5 , Σ_y …=5 | min(5,5,5)=5 |
2 | A = 2 , B = 2 , both sums = 4 | min(5,4,4)=4 |
Both match the required outputs.
Let me know if you’d like a quick visual diagram of the reasoning or a walkthrough of the constructive pairing!
بازی اسنوکر
محدودیت زمان: ۱ ثانیه
محدودیت حافظه: ۲۵۶ مگابایت
در یک بازی اسنوکر کوئرایی، مجموعاً ۲۲ توپ استفاده میشود؛ ۱ توپ سفید، ۱۵ توپ قرمز و ۶ توپ رنگی (قرمز و سفید را رنگی در نظر نگیرید ولی مشکی رنگی است). اطلاعات این توپها به شرح زیر است:
رنگ نام انگلیسی امتیاز
توپ سفید white ۰ امتیاز
توپ قرمز red ۱ امتیاز
توپ زرد yellow ۲ امتیاز
توپ سبز green ۳ امتیاز
توپ قهوهای brown ۴ امتیاز
توپ آبی blue ۵ امتیاز
توپ صورتی pink ۶ امتیاز
توپ مشکی black ۷ امتیاز
برای کسب امتیاز، ابتدا باید سعی کنید که یک توپ قرمز را پاکِت کنید (وارد سوراخ کنید). پس از پاکت شدن توپ قرمز، میتوانید یکی از توپهای رنگی یا قرمز را به دلخواه است. پس از پاکت توپ رنگی، (در صورت وجود توپ قرمز روی میز) آن توپ رنگی دوباره به میز باز میگردد (توپهای قرمز بر نمیگردند).
بازی به همین ترتیب ادامه پیدا میکند. اگر تمام توپهای قرمز پاکت شوند و دیگر توپ قرمزی باقی نماند، میتوانیم توپهای رنگی را وارد کنیم؛ در این صورت توپها به میز باز نمیگردند. توپ سفید همیشه به میز باز میگردد.
اگر در طول بازی، بازیکن توپ سفید را وارد سوراخ کند، یا نتواند توپی را وارد سوراخ کند و یا توپی را خلاف قوانین وارد بازی کند (مثلاً باید قبل از توپ رنگی توپ قرمز وارد کرده باشد) امتیاز توپ وارد شده را نمیگیرد و نوبت حریف میشود.
بازیکنان هر بار که توپ را با موفقیت پاکت کنند، امتیاز میگیرند.
در این سوال برای پایان بازی نیازی نیست همهی توپها پاکت شده باشند و برنده بازی با جمع امتیازها مشخص میشود. دو بازیکن بعد از بازی اسنوکر به سراغ شما میآیند و دنبالهی نتیجهی ضربهها را به شما میگویند و از شما میخواهند که نتیجه بازی که یکی از حالتهای برد بازیکن اول (First)، برد بازیکن دوم (Second) یا تساوی (Tie) است، را مشخص کنید.
توجه کنید ممکن است هیچ راهی برای درست در نظر گرفتن قوانین وجود نداشته باشد، در این حالت Invalid چاپ کنید.
برای بهتر متوجه شدن سوال، به مثالها مراجعه کنید.
ورودی
ابتدا در خط اول یک عدد
n
n داده میشود که اندازهی دنبالهی ضربهها را مشخص میکند.
1
≤
n
≤
1
0
0
1≤n≤100
سپس در
n
n خط بعدی، در هر خط یک رنگ داده میشود و یا کلمهی miss نوشته میشود که یعنی توپی در این ضربه پاکت نشده است.
خروجی
در یک خط برنده بازی را مشخص کنید، اگر نفر اول برنده است، First، اگر نفر دوم برنده است، Second و اگر بازی به تساوی رسیده، Tie و در صورتی که ورودیها با قوانین بازی تناقض دارند، Invalid را چاپ کنید.
مثالها
ورودی نمونه ۱
10
red
black
white
red
blue
green
red
miss
red
yellow
Plain text
خروجی نمونه ۱
Tie
Plain text
بازیکن اول توپ قرمز را پاکت میکند؛ پس 1-0 نتیجه فعلی است.
بازیکن اول توپ سیاه را پاکت میکند. چون این توپ رنگی است و توپ قبلی را قرمز وارد کرده، ۷ امتیاز آن را میگیرد؛ پس نتیجه بازی 8-0 میشود. بعد از آن چون هنوز توپهای قرمز تمام نشده، توپ مشکی به میز بر میگردد.
بازیکن اول توپ سفید را پاکت میکند؛ پس هیچ امتیازی نمیگیرد و نوبت بازیکن دوم میشود.
بازیکن دوم توپ قرمز را پاکت میکند؛ پس نتیجه بازی 8-1 میشود.
بازیکن دوم توپ آبی را پاکت میکند؛ پس به دلیل مشابه ضربه ۲، امتیاز آن را میگیرد و نتیجه بازی 8-6 میشود.
بازیکن دوم توپ سبز را پاکت میکند ولی توپ قبلی قرمز نبوده؛ پس توپ سبز را مجدداً به میز بازی بر میگردانند و هیچ امتیازی کسب نمیکند و نوبت به بازیکن اول بر میگردد.
بازیکن اول توپ قرمز را پاکت میکند؛ پس نتیجه بازی 9-6 میشود.
بازیکن اول موفق نمیشود در این ضربه توپی را پاکت کند؛ پس نوبت به بازیکن دوم میرسد.
بازیکن دوم یک توپ قرمز پاکت میکند؛ پس نتیجه بازی به 9-7 تغییر میکند.
بازیکن دوم توپ زرد را پاکت میکند؛ پس به دلیل مشابه ضربه ۲، امتیاز آن را میگیرد و نتیجه بازی 9-9 میشود و توپ زرد به میز بر میگردد.
در نهایت بازی با نتیجهی تساوی (Tie) به پایان میرسد.
ورودی نمونه ۲
10
red
black
red
miss
red
blue
red
red
yellow
red
Plain text
خروجی نمونه ۲
Second
Plain text
بازیکن اول توپ قرمز را پاکت میکند؛ پس1-0 نتیجه فعلی است.
بازیکن اول توپ سیاه را پاکت میکند. چون این توپ رنگی است و توپ قبلی را قرمز وارد کرده، ۷ امتیاز آن را میگیرد؛ پس نتیجه بازی 8-0 میشود. بعد از آن چون هنوز توپهای قرمز تمام نشده، توپ مشکی به میز بر میگردد.
بازیکن اول توپ قرمز را پاکت میکند؛ پس ۱ امتیاز میگیرد. نتیجه فعلی 9-0 و نوبت بازیکن اول میماند.
بازیکن اول هیچ توپی را پاکت نمیکند؛ پس نوبت هیچ امتیازی نمیگیرد و بازیکن دوم میشود.
بازیکن دوم توپ قرمز را پاکت میکند؛ پس ۱ امتیاز میگیرد. نتیجه فعلی 9-1 و نوبت بازیکن دوم میماند.
بازیکن دوم توپ آبی را پاکت میکند و چون توپ قبلی را قرمز وارد کرده؛ پس ۵ امتیاز آن را میگیرد. نتیجه بازی 9-6 میشود و بعد از آن چون هنوز توپهای قرمز تمام نشده، توپ آبی به میز بر میگردد.
بازیکن دوم توپ قرمز را پاکت میکند؛ پس نتیجه بازی 9-7 میشود.
بازیکن دوم توپ قرمز را پاکت میکند؛ پس نتیجه بازی 9-8 میشود.
بازیکن دوم یک توپ زرد پاکت میکند؛ پس ۲ امتیاز میگیرد و نتیجه بازی به 9-10 تغییر میکند.
بازیکن دوم توپ قرمز را پاکت میکند؛ پس نتیجه بازی 9-11 میشود.
در نهایت بازی با نتیجهی برد بازیکن دوم (Second) به پایان میرسد.
ورودی نمونه ۳
1
red
Plain text
خروجی نمونه ۳
First
Plain text
بازیکن اول توپ قرمز را پاکت میکند. بازی 1-0 و با نتیجهی برد بازیکن اول (First) به پایان میرسد.
ورودی نمونه ۴
17
red
red
red
red
red
red
red
red
red
red
red
red
red
red
red
yellow
yellow
Plain text
خروجی نمونه ۴
Invalid
Plain text
در این حالت بازیکن اول همهی ۱۵ توپ قرمز را پاکت میکند. در نتیجه اگر توپ رنگی وارد شود دیگر به میز بر نمیگردد ولی بعد از آن دو بار توپ زرد پاکت شده و این طبق قوانین ممکن نیست. بنابراین پاسخ Invalid است.
در ادامه ابتدا منطق حل را به طور خلاصه توضیح میدهیم و سپس کد نهایی را ارائه میکنیم.
شبیهسازی کامل میز
reds
) را نگه میداریم (ابتدا 15).colors_on_table
) را نگه میداریم (6 رنگ).Invalid
.گردش نوبتها
player
(۰ برای «First» و ۱ برای «Second») نشان میدهد چه کسی در نوبت است.قانون مجاز بودن رنگی
can_pot_color
فقط وقتی True
میشود که همان بازیکن لحظۀ قبل یک قرمز پاکت کرده باشد و هنوز حداقل یک قرمز روی میز مانده باشد.can_pot_color
فعال باشد خطاست، امّا فقط یک خطای عادی است (امتیاز صفر + تعویض نوبت) و ورودی را Invalid
نمیکند.can_pot_color
دیگر مطرح نیست.شرایطی که ورودی را واقعاً Invalid میکند
O(n)
(n حداکثر 100)python#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys COLOR_SCORE = { "yellow": 2, "green": 3, "brown": 4, "blue": 5, "pink": 6, "black": 7, } def main() -> None: data = sys.stdin.read().strip().splitlines() if not data: return try: n = int(data[0].strip()) except ValueError: print("Invalid") return shots = [line.strip().lower() for line in data[1: n+1]] reds = 15 colors_on_table = set(COLOR_SCORE) # 6 توپ رنگی score = [0, 0] # امتیاز First و Second player = 0 # 0: First, 1: Second can_pot_color = False # فقط بعد از قرمز و تا قبل از رنگی for s in shots: # ---------------- موارد بدون امتیاز ---------------- if s == "miss" or s == "white": player ^= 1 # تعویض نوبت can_pot_color = False continue # ---------------- توپ قرمز ---------------- if s == "red": if reds == 0: # قرمزی روی میز نمانده! print("Invalid") return reds -= 1 score[player] += 1 can_pot_color = True continue # ---------------- توپ رنگی ---------------- if s in COLOR_SCORE: # آیا اصلاً روی میز هست؟ if s not in colors_on_table: print("Invalid") return if reds > 0: # باید قبلاً قرمز زده باشد if not can_pot_color: # خطا: امتیاز نمیگیرد، توپ برمیگردد، نوبت عوض میشود player ^= 1 can_pot_color = False continue # ضربهٔ مجاز score[player] += COLOR_SCORE[s] # چون هنوز قرمز هست توپ برمیگردد → مجموعه تغییر نمیکند can_pot_color = False # برای رنگی بعدی دوباره باید قرمز بزند else: # قرمز تمام شده: رنگی برای همیشه حذف میشود score[player] += COLOR_SCORE[s] colors_on_table.remove(s) # حالت can_pot_color دیگر اهمیتی ندارد continue # ---------------- ورودی ناشناخته ---------------- print("Invalid") return # ---------------- پایان بازی ---------------- if score[0] > score[1]: print("First") elif score[1] > score[0]: print("Second") else: print("Tie") if __name__ == "__main__": main()
این پیادهسازی دقیقاً نمونههای ارائهشده در صورت سؤال را تولید میکند و همهٔ قوانین ذکرشده را رعایت میکند. هرگونه سؤال یا ابهامی داشتید، در خدمتم!