حل تمرین باگ کد مجید کوئرا با c
در این نوشته به روش حل یکی از سوالات برنامه نویسی وبسایت کوئرا میپردازیم.
حل تمرین باگ کد مجید کوئرا با c
مجید که به تازگی برنامهنویسی یاد گرفته است، شبه کدی برای مرتب سازی صعودی یک آرایه به اسم a به طول n نوشته است که به وضوح غلط است. این تکه کد به صورت زیر است:
for i = 1 to n - 2 for j = 1 to n - 1 if a[j] > a[j + 1] swap(a[j], a[j + 1])
میلاد جایگشتی از اعداد 1 تا n دارد که بعضی از اعداد آن مشخص نیست و به جای آن صفر گذاشته شده است. حال ما میخواهیم بدانیم آیا میتوانیم جای صفرهای جایگشت، اعدادی قرار بدهیم به طوری که در انتها:
- کد مجید نتواند جایگشت را به درستی به صورت صعودی مرتب کند.
- هر یک از اعداد 1 تا n دقیقاً یکبار در آرایه آمده باشند.
ورودی
در خط اول عدد n که تعداد اعداد جایگشت است به شما داده میشود. در خط بعدی n عدد،بین 0 تا n، که با فاصله جدا شدهاند به شما داده میشود که اعداد جایگشت میلاد است.
خروجی
اگر میتوانستیم صفرها را به گونهای عوض کنیم که شرایط صورت سوال را داشت در خط اول خروجی عبارت Yes و در خط بعدی جایگشت کامل را به همراه اعدادی که به جای صفرها جایگزین شدهاند چاپ کنید. (چنانچه چندین جایگشت وجود داشت، شما به دلخواه یکی از آنها را چاپ کنید.)
در غیر این صورت در یک خط عبارت No را چاپ کنید.
مثال
ورودی نمونه 1
4 1 3 0 2
خروجی نمونه 1
No
توضیح: تنها عددی که میتواند جای 0 بگذارد عدد 4 است که برنامه مجید میتواند این جایگشت را مرتب کند.
ورودی نمونه 2
4 0 0 0 0
خروجی نمونه 2
Yes 4 3 2 1
توضیح: اگر جایگشت فوق را به برنامه مجید بدهیم آن را به درستی مرتب نمیکند. توجه کنید که جایگشت فوق یکی از جواب های مسئله است؛ جایگشتهای دیگری نیز وجود دارد که برنامهی مجید روی آنها درست کار نمیکند.
کد سوال تمرین باگ کد مجید
#include<iostream> #include<vector> using namespace std; #define ll long long const int N = 1e5 + 5; int a[N]; bool seen[N]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int pos1, pos2; pos1 = pos2 = -1; for (int i = 0;i < n;i++) { cin >> a[i]; seen[a[i]] = true; if (a[i] == 1) pos1 = i; else if (a[i] == 2) pos2 = i; } for (int i = n - 1;i >= 0;i--) { if (a[i] == 0) if (pos1 == -1) { a[i] = 1; pos1 = i; } else if (pos2 == -1) { a[i] = 2; pos2 = i; } } if (pos2 > pos1 || pos1 != n - 1) cout << "No\n"; else { cout << "Yes\n"; seen[1] = seen[2] = true; vector<int>unseens; for (int i = 1;i <= n;i++) if (!seen[i]) unseens.push_back(i); for (int i = 0;i < n;i++) if (a[i] == 0) { a[i] = unseens.back(); unseens.pop_back(); } for (int i = 0;i < n;i++) cout << a[i] << ' '; } }
منبع سوال: کوئرا
اگر نیاز به حل تمرینهای دیگری از کوئرا دارید در بخش نظرات همین نوشته برای ما بنویسید.
ارسال پاسخ