سوالات هفته پنجم، دومین دوره لیگ مای‌کد به همراه پاسخ

سوالات هفته پنجم، دومین دوره لیگ مای‌کد به همراه پاسخ

سوالات چالشی هفته پنجم دومین دوره لیگ مای‌کد به همراه پاسخ‌های مورد انتظار تست کیس‌ها جهت آشنایی بیشتر شرکت‌کنندگان در لیگ منتشر می‌گردد.

پاسخ‌های تیم برنده جهت افزایش جنبه آموزشی  و استفاده سایر شرکت‌کنندگان پس از آزمون کامنت گذاری شده است.

دریافت
عنوان: سوال چالشی آموزشی توقف زودهنگام
حجم: 419 کیلوبایت

پاسخ تیم برنده


دریافت
عنوان: سوال چالشی جمع مبنای 16
حجم: 256 کیلوبایت

پاسخ تیم برنده 


دریافت
عنوان: سوال چالشی mst
حجم: 426 کیلوبایت
پاسخ تیم برنده


تابع اصلی مرتبط با سوال اول

 
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

	// خواندن ورودی و چاپ خروجی با فایل
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    for (int j = 0; j < 1000; j++)
    {
        int N;
        int T;
        cin >> N >> T;

        int sum = 0; // مجموع رشدهای معتبر
        int prevY = -1000; // مقدار رشد قبلی
        int c = 0; // شمارنده تعداد مراحل متوالی بدون افزایش
        bool stop = 0; // فلگ توقف سیستم

        for (int i = 0; i < N; i++)
        {
            int x, y;
            cin >> x >> y;


            if (stop)
                continue;

            if ((x < 0 || y < 0) || (x > T || y > T))
                continue; // بررسی شرط اول

			// بررسی توقف زودهنگام
            if (prevY != -1000)
            {
                if (y <= prevY)
                {
                    c++;
                    if (c == 3)
                    {
                        stop = 1; // فعال شدن توقف
                        continue;
                    }
                }
                else
                    c = 0; // در صورت افزایش رشد، شمارنده ریست می‌شود
            }

            sum += y;
            prevY = y;
        }

        cout << sum << endl;
    }

    return 0;
}

تابع اصلی مرتبط با سوال دوم

#include <bits/stdc++.h>
using namespace std;


/*
  تبدیل یک کاراکتر هگزادسیمال به مقدار عددی آن
  اگر رقم بین 0 تا 9 باشد مقدار مستقیم برگردانده می‌شود
  اگر بین A تا F (یا a تا f) باشد به بازه 10 تا 15 تبدیل می‌شود
*/
int hexVal(char c) {
    if (c >= '0' && c <= '9') 
        return c - '0';
    return toupper(c) - 'A' + 10;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

	// خواندن ورودی و چاپ خروجی با فایل
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    string a, b;
    while (cin >> a >> b) 
    {
		// معکوس کردن رشته‌ها برای شروع جمع از رقم کم‌ارزش‌تر (سمت راست)
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());

		// تعیین بیشترین طول برای پیمایش
        int n = max(a.size(), b.size());
        int c = 0, count = 0; // متغیر مقدار و تعداد انتقال ها

        for (int i = 0; i < n || c; i++) 
        {
			// اگر از طول رشته عبور کنیم، مقدار آن صفر در نظر گرفته می‌شود
            int na = (i < a.size()) ? hexVal(a[i]) : 0;
            int nb = (i < b.size()) ? hexVal(b[i]) : 0;
			// جمع دو رقم به همراه انتقال قبلی
            int sum = na + nb + c;
			// محاسبه انتقال جدید در مبنای 16
            c = sum / 16;
			// اگر انتقال رخ دهد، شمارنده افزایش می‌یابد
            if (c) 
                count++;
        }
        cout << count << endl;
    }

    return 0;
}

تابع اصلی مرتبط با سوال سوم

 
#include <bits/stdc++.h>
#pragma GCC target ("avx,avx2,fma")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define X first
#define Y second
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1007;
//محاسبه فاصله دو نقطه
double dist(pair<double,double> a, pair<double,double> b){
    double dx = a.X - b.X;
    double dy = a.Y - b.Y;
    return sqrt(dx * dx + dy * dy);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int n;
    while(cin >> n){
        vector<pair<double,double>> p(n);

        for(int i = 0; i< n; i++){
            cin>>p[i].X>>p[i].Y;
        }
        //کوتاه ترین فاصله راس v از MST
        vector mdist(n, 1e9);
        //وکتور برای نشانه گذاری اینکه داخل MST هست یا نه
        vector mark(n, false);
        //مقدار دهی اولیه
        mdist[0] = 0;
        double ans = 0;
        // در هر مرحله نزدیکترین راس به MST مان اضافه میکنیم
        for(int i = 0; i < n; i++){
            int u = -1;
            // پیدا کردن رأسی که کمترین فاصله را از MST دارد
            for(int j = 0; j < n; j++){
                if(!mark[j] && (u == -1 || mdist[j] < mdist[u])){
                    u = j;
                }
            }
            //اضافه کردن به جواب و اضافه کردن راس u به MST
            mark[u] = true;
            ans += mdist[u];
            //آپدیت کردن فاصله ها بعد از اضافه کردن راس u یه MST
            for(int v = 0; v < n; v++){
                if(!mark[v]){
                    double d = dist(p[u], p[v]);
                    mdist[v] = min(mdist[v], d);
                }
            }
        }
        //چاپ خروجی با گرد کردن رو به بالا
        cout<<ceil(ans)<<endl;
    }

    return 0;
}


۰ ۰ ۰ دیدگاه

دیدگاه‌ها

هیچ نظری هنوز ثبت نشده است.
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

لیگ دانش‌آموزی - مای‌کُد

این لیگ در طول سالی تحصیلی و از آذر‌ماه تا فروردین‌ماه سال بعد به صورت ترکیبی برخط/حضوری برگزار خواهد شد.

دسته‌بندی
آخرین مطلب
پیوندها
بایگانی