ভূমিকা
একটি সাধারণ নির্বাচনে, সংসদীয় আসন প্রতি স্থির মূল্য গণনা করতে চাই। এর অর্থ এই যে জন্য N >= 0
আসন বণ্টন করা প্রয়োজন এবং একটি তালিকা ns
পার্টি অনুযায়ী ভোট, আমরা একটি সংখ্যা খুঁজে বের করতে চাই d
যেমন যে
sum(floor(n/d) for n in ns) == N
জিনিসগুলিকে আকর্ষণীয় করে তুলতে (এবং আরও বাস্তব বিশ্বের মতো), আমরা আরও দুটি তথ্য যুক্ত করি:
দুটি দল একটি 'জোটে' জড়ো হতে পারে, যাতে আসনগুলিতে সমস্ত দলের ভোটের যোগফল দ্বারা 'জোটকে' দেওয়া হয়। তারপরে 'জোট' প্রাপ্ত আসনগুলি একই ধরণের দলগুলির মধ্যে বিভক্ত হয়ে যাবে (বিভাজন অনুসন্ধান করুন ইত্যাদি))
যে দলটি ভোটের একটি নির্দিষ্ট শতাংশ (উদাহরণস্বরূপ 3.25%) পাস করেনি তা স্বয়ংক্রিয়ভাবে 0 টি আসন লাভ করে এবং এর ভোটগুলি 'জোট' হিসাবে গণ্য হয় না।
চ্যালেঞ্জ
আপনাকে দেওয়া হল:
- তালিকাভুক্ত তালিকার প্রতিটি নেস্টেড তালিকায় পূর্ণসংখ্যার (ভোটের সংখ্যা) রয়েছে এবং এটি একটি একক দলের জন্য দৈর্ঘ্য 1 এবং একটি 'জোটের' জন্য দৈর্ঘ্য 2।
- ভগ্নাংশ হিসাবে আসন পেতে ন্যূনতম শতাংশের ভোট ("ব্যারেজের জন্য" ওরফে "বার") (সুতরাং ৩.২৫% 0.0325 হিসাবে দেওয়া হয়)
- সমস্ত দলের (পূর্ণসংখ্যার) মধ্যে বিতরণ করার জন্য মোট আসন সংখ্যা
আপনি সংসদীয় আসনের পরিবর্তে ভোটের সংখ্যা সহ একই নেস্টেড তালিকা কাঠামোটি মুদ্রণ করতে হবে।
বিজয়ী হ'ল সর্বনিম্ন পরিমাণে বাইট সহ কোড।
কোণার কেস:
- একাধিক সম্ভাব্য বিভাজক (এবং সাধারণত হতে পারে) থাকতে পারে। যেহেতু এটি আউটপুটে নেই, তাই এটি আসলে কোনও বিষয় নয়।
- কল্পনা করুন
N=10
এবংns = [[1]]
, তাই বিভাজকটি 0.1 হতে পারে (কোনও পূর্ণসংখ্যার নয়) - কিছু কিছু ক্ষেত্রে উদাহরণস্বরূপ সমাধান করা যায় না, ,
ns=[[30],[30],[100]]
, ।bar=0
N=20
সেখানে একটি সীমানা রয়েছেd=7.5
যেখানে মেঝেযুক্ত মানগুলির যোগফল 19 থেকে 21 পর্যন্ত লাফায় You (এই কেসটি দেখানোর জন্য কমিউনিটির সদস্য আর্নল্ডকে ধন্যবাদ)
উদাহরণ ইনপুট এবং আউটপুট
পাইথন 3 একটি খুব অপ্টিমাইজড উদাহরণ:
from math import floor
def main(_l, bar, N):
# sum all votes to calculate bar in votes
votes = sum(sum(_) for _ in _l)
# nullify all parties that didn't pass the bar
_l = [[__ if __ >= bar * votes else 0 for __ in _] for _ in _l]
# find divisor for all parliament seats
divisor = find_divisor([sum(_) for _ in _l], N)
# find divisor for each 'coalition'
divisors = [find_divisor(_, floor(sum(_)/divisor)) for _ in _l]
# return final results
return [[floor(___/_) for ___ in __] for _, __ in zip(divisors, _l)]
def find_divisor(_l, N, _min=0, _max=1):
s = sum(floor(_ / _max) for _ in _l)
if s == N:
return _max
elif s < N:
return find_divisor(_l, N, _min, (_max + _min) / 2)
else:
return find_divisor(_l, N, _max, _max * 2)
print(main(l, bar, N))
উদাহরণ ইনপুট:
l = [[190970, 156473],
[138598, 173004],
[143666, 193442],
[1140370, 159468],
[258275, 249049],
[624, 819],
[1125881],
[152756],
[118031],
[74701]]
bar = 0.0325
N = 120
এবং এর আউটপুট:
[[6, 4], [0, 5], [4, 6], [35, 5], [8, 8], [0, 0], [35], [4], [0], [0]]
আরও কিছু উদাহরণ আউটপুট:
যদি bar=0.1
আমরা দুটি দলের মধ্যে একটি আকর্ষণীয় স্ট্যান্ড অফ পেয়ে থাকি কারণ ছোট দলের কোনওটিতেই গণ্য হয় না:
[[0, 0], [0, 0], [0, 0], [60, 0], [0, 0], [0, 0], [60], [0], [0], [0]]
এবং যদি N=0
(কর্নার কেস) হয় তবে অবশ্যই কেউ কিছু পান না:
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0], [0], [0]]
d=7.5
19 টি আসন থেকে 21 টি আসনে লাফিয়ে উঠতে পারেন না is