جستجو در برنامه نویسی پایتون مشکل در تمرین

با سلام و خسته نباشید

مهدی که از کدزدن خسته شده است، به سراغ بازی‌های دوران کودکی‌اش رفته است. اما چون کسی را نمی‌شناسد که با او این نوع بازی‌ها را انجام دهد، مجبور است قوانین بازی را تغییر داده و یک نفره بازی کند. برای شروع اون می‌خواهد بازی "گردو، شکستم" یک نفره بازی کند. بازی به این صورت است که مهدی در فاصله‌ی nn سانتی‌متری از دیوار ایستاده است و میخواهد به دیوار برسد. برای این کار او میتواند پایش را به صورت طولی جلوی پای قبلی بگذارد و به جلو برود و یا پایش را به صورت عرضی جلوی پای قبلی خود بگذارد. هدف این است که او جوری پاهایش را بگذارد و جلو برود که در انتها پایش با دیوار مماس شود. اما مهدی دیگر کد نمی‌زند، برای همین شما باید به اون کمک کنید تا بفهمد چگونه این بازی را ببرد. یعنی به او بگویید که چند بار پایش را طولی و چند بار عرضی بگذارد تا در نهایت مسافت دقیقا nn سانتی‌متر را طی کرده و پایش با دیوار مماس شود. و یا به او بگویید که این کار غیرممکن است.

ورودی
در تنها سطر ورودی سه عدد nn و xx و yy به شما داده شده است که به ترتیب نمایانگر فاصله‌ی مهدی تا دیوار و طول و عرض پاهای مهدی است.1 \le n, x, y \le 100\ 0001≤n,x,y≤100 000

خروجی
خروجی شامل دو عدد است که با فاصله از یکدیگر جدا شده‌اند. این اعداد باید به ترتیب نشان‌دهنده‌ی تعداد دفعاتی باشند که مهدی باید پایش را طولی و عرضی بگذارد. ممکن است چند جواب برای یک ورودی وجود داشته باشد. شما می‌توانید هرکدام را به دلخواه چاپ کنید. اگر حالتی وجود نداشت که مهدی پایش را با دیوار مماس کند تنها یک عدد 1- در خروجی چاپ کنید.

مثال
ورودی نمونه ۱
10 2 3

خروجی نمونه ۱
2 2

دقت کنید که 0 5 نیز یک جواب صحیح برای مثال شماره ۱ می‌باشد؛ زیرا با ۵ قدم طولی مهدی ۱۰ سانتی‌متر طی می‌کند.

ورودی نمونه ۲
10 4 7

خروجی نمونه ۲
-1

در این مثال مهدی نمی‌تواند هیچ‌گاه با برداشتن گام‌های بطول ۴ یا ۷ سانتی‌متر، ۱۰ سانتی‌متر جلو برود.

n,x,y = map(int,input().split())
answeri = 0
answerj = 0
for i in range(n):
for j in range(n):
a = x * i
b = y * j
if a + b == n and a != 0 and b != 0 :
answeri = i
answerj = j

if answeri != 0 and answerj != 0:
print(answeri,answerj)
else:
print(-1)

من برنامه رو نوشتم ولی 50درصد درسته ولی نمی دونم مشکل از کجاست لطفا راهنمایی کنید

پاسخ ها

sokanacademy forum
کاربر سکان آکادمی 3 سال پیش

میشه حالتی که مشکل داره رو به ما هم نشون بدید تا بتونیم مشکل رو باز تولید کنیم؟
به نظرم شرط هایی که گذاشتین باید اصلاح بشه. من شروط کد زیر رو پیشنهاد می کنم:

n,x,y = map(int,input().split())
max_x_count = (n // x) + 1
max_y_count = (n // y) + 1
answeri = -1
answerj = -1
for i in range(max_x_count):
#{
 a = x * i
 for j in range(max_y_count):
 #{
 b = y * j
 if (a + b == n):
 #{
 answeri = i
 answerj = j
 #}
 #}
#}
if answeri != -1 and answerj != -1:
#{
 print(answeri,answerj)
#}
else:
#{
 print(-1)
#}
sokanacademy forum
کاربر سکان آکادمی 3 سال پیش

با سلام و وقت بخیر

با تشکر از اینکه وقت گذاشتید

ولی من این رو توی سایت آپلود می کنم جوای نمی ده

من اینو اجرا می کنم در صورتی که ورودی برنامه 2 3 10 باشه باید خروجی 2 2 رو چاپ کنه که 2 * 3 و 2*2 برابر با عدد 10 می باشد

********************************
دلیلش حلقه‌ی تو در تویی که استفاده فرمودید‌. اگه دقت بفرمایید ما به ازای یک مقدار مشخص x، نیاز نیست y های مختلف رو امتحان کنیم که ببینیم حاصل برابر n می‌شه یا نه. پس بهتره که فقط یه حلقه روی یکی از x و y بزنیم و با توجه به مقدار اون متغیر و n ببینیم که مقدار متغیر دوم‌مون صحیح می‌شه یا نه.

https://quera.ir/problemset/contest/3540/%D8%B3%D8%A4%D8%A7%D9%84-%D8%AC%D8%B3%D8%AA-%D9%88-%D8%AC%D9%88-%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%A7%D8%AA-%DA%AF%D8%B1%D8%AF%D9%88-%D8%B4%DA%A9%D8%B3%D8%AA%D9%85

sokanacademy forum
کاربر سکان آکادمی 3 سال پیش

همونطور که توی صورت سوال گفته جواب یکتا وجود نداره خیلی وقتا و جوابی که کد بالا میده هم مشکلی نداره و درسته. اگر میخواید اولین جواب رو به دست بیارید میتونید از کد زیر استفاده کنید:

def solve(n, x, y):
#{
 max_x_count = (n // x) + 1
 max_y_count = (n // y) + 1
 answeri = -1
 answerj = -1
 for i in range(max_x_count):
 #{
 a = x * i
 for j in range(max_y_count):
 #{
 b = y * j
 if (a + b == n):
 #{
 answeri = i
 answerj = j
 return (answeri, answerj)
 #}
 #}
 #}
#}

n,x,y = map(int,input().split())
answers = solve(n, x, y)
if answers[0] != -1 and answers[1] != -1:
#{
 print(answers[0],answers[1])
#}
else:
#{
 print(-1)
#}

فراموش نکنید که indetation رو درست کنید. من با کامنت سعی کردم حالت درست و بلاک های کد رو نشون بدم.

البته که فرمتی که سایت شما قبول میکنه رو نمیدونم و بهتره کد رو متناسب با اون چک کنید.

sokanacademy forum
کاربر سکان آکادمی 3 سال پیش

با سلام و وقت بخیر

با تشکر از اینکه وقت گذاشتید

ولی من این رو توی سایت آپلود می کنم جوای نمی ده

من اینو اجرا می کنم در صورتی که ورودی برنامه 2 3 10 باشه باید خروجی 2 2 رو چاپ کنه که 2 * 3 و 2*2 برابر با عدد 10 می باشد

********************************
دلیلش حلقه‌ی تو در تویی که استفاده فرمودید‌. اگه دقت بفرمایید ما به ازای یک مقدار مشخص x، نیاز نیست y های مختلف رو امتحان کنیم که ببینیم حاصل برابر n می‌شه یا نه. پس بهتره که فقط یه حلقه روی یکی از x و y بزنیم و با توجه به مقدار اون متغیر و n ببینیم که مقدار متغیر دوم‌مون صحیح می‌شه یا نه.

https://quera.ir/problemset/contest/3540/%D8%B3%D8%A4%D8%A7%D9%84-%D8%AC%D8%B3%D8%AA-%D9%88-%D8%AC%D9%88-%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%A7%D8%AA-%DA%AF%D8%B1%D8%AF%D9%88-%D8%B4%DA%A9%D8%B3%D8%AA%D9%85

sokanacademy forum
کاربر سکان آکادمی 3 سال پیش

دقیقا پاسخ قبلی رو میدید؟ اگر برنامه رو اجرا کردید باید بدونید که آخرین پاسخ من برای ۲ ۳ ۱۰ خروجی ۲ ۲ رو چاپ میکنه هرچند که بعید میدونم مهم باشه، چون در نهایت باید درستی جواب چک بشه و منطقی نیست وقتی یک ورودی چند جواب داره ما فقط یک مورد رو قبول کنیم. طبیعتا من نمیتونم برم و توی سایتی که گفتید چک کنم اما خوشحال میشم اگر مشکلی و خطایی وجود داره مراحل بازتولید اون خطا رو بدید به ما تا بتونیم پاسخ خوبی به شما بدیم.

online-support-icon