من رفتم سربازی اگر محتوای منو دوست داشتید و بدردتون خورد از من حمایت مالی کنید

پاسخ سوال تولد تاریخی کوئرا

پاسخ سوال تولد تاریخی کوئرا
پاسخ سوال تولد تاریخی کوئرا

پاسخ سوال تولد تاریخی کوئرا

در این نوشته تمرین “تولد تاریخی” که در وب‌سایت کوئرا موجود است را برای شما کاربران عزیز حل کرده‌ایم.

 

پاسخ سوال تولد تاریخی کوئرا

فردا تولد حیدریه!

اما حیدری به روز دقیق تولد اعتقادی ندارد و می‌خواهد جوری تولد بگیرد که همه یک عالمه خوشحال شوند. حیدری لیست تاریخ تولد همه دوستانش را دارد و می‌داند که همه دوستانش در جعبه فکر می‌کنند. بخاطر همین همه دوستانش دقیقاً در روز تولد خودشان مهمانی می‌گیرند. تو جهان خارج جعبه‌ی حیدری تقویم میلادی برقرار و امروز ۲۷ اکتبر است. تو این تقویم سال کبیسه وجود ندارد. حیدری نوتیس کرده که دوستانش وقتی از مهمانی تولدش خوشحال می‌شوند که زمان زیادی از آخرین مهمانی تولدی که گرفته شده گذشته. بخاطر همین او روزی را انتخاب می‌کند که از آخرین تولد قبل از آن زمان زیادی بگذرد. حیدری طبعاً نمی‌خواهد روز تولدش با کسی یکسان شود. هم‌چنین اگر چندین تاریخ است که دوستانش به بیش‌ترین حالت ممکن خوشحال شوند، او نزدیک‌ترین تاریخ به امروز (۲۷ اکتبر!) را برای گرفتن تولد انتخاب می‌کند. اما این تاریخ نباید امروز شود.

تقویم میلادی

هم‌چنین در نظر بگیرید که در جهان خارج جعبه حیدری تمامی سال‌های میلادی به صورت تصویر بالا هستند! به حیدری کمک کنید بهترین روز را برای برگزاری مهمانی تولد انتخاب کند.

 

ورودی سوال تولد تاریخی

در خط اول ورودی  تعداد دوستان حیدری می‌آید. سپس در n خط بعدی به ترتیب در هر خط نام یکی از دوستان حیدری و سپس تاریخ تولد او می‌آید که با یک فاصله از هم جدا شده‌اند. نام دوستان حیدری رشته‌ای با حداکثر ۲۰ حرف متشکل از حروف بزرگ و کوچک انگلیسی است، و هم‌چنین تاریخ تولد هر نفر به صورت mm داده می‌شود که در آن  نشان‌دهنده ماه و d نشان دهنده روز تولد است. تضمین می‌شود که مقدار تاریخ‌های تولد درست است.

خروجی سوال تولد تاریخی

در تنها خط خروجی یک تاریخ به همان صورت dm چاپ کنید که بهترین روز برای برگزاری مهمنی تولد حیدریست. توجه کنید در صورت وجود چند جواب حیدری روزی را انتخاب می‌کند که به امروز (۲۷ اکتبر!) نزدیک‌تر است ولی امروز نیست! هم‌چنین تولد حیدری ممکن است در سال بعدی میلادی برگزار شود! یعنی مثلاً بعد ماه آخر میلادی (دسامبر) ماه اول سال بعد (ژانویه) است سپس ماه دوم می‌آید و به همین ترتیب…

 

حل سوال تولد تاریخی

#include <iostream>
#include <string>
using namespace std;
 
 
int main()
{
    int n;
    cin >> n;
    string temp;
    int bdays[n];
    int monthBeforeDays[12];
    monthBeforeDays[0] = 0;
    monthBeforeDays[1] = 31 + monthBeforeDays[0];
    monthBeforeDays[2] = 28 + monthBeforeDays[1];
    monthBeforeDays[3] = 31 + monthBeforeDays[2];
    monthBeforeDays[4] = 30 + monthBeforeDays[3];
    monthBeforeDays[5] = 31 + monthBeforeDays[4];
    monthBeforeDays[6] = 30 + monthBeforeDays[5];
    monthBeforeDays[7] = 31 + monthBeforeDays[6];
    monthBeforeDays[8] = 31 + monthBeforeDays[7];
    monthBeforeDays[9] = 30 + monthBeforeDays[8];
    monthBeforeDays[10] = 31 + monthBeforeDays[9];
    monthBeforeDays[11] = 30 + monthBeforeDays[10];
    for(int i=0; i<n; i++)
    {
        cin >> temp >> temp;
        int month = stoi(temp.substr(0,2));
        bdays[i] = monthBeforeDays[month-1] + stoi(temp.substr(3,2));
        //cout << bdays[i] << endl;
    }
    
    int maxHappiness = -1;
    int bestDay = -1;
    for(int i=301; i<=365; i++)
    {
        int mhappiness = 1000000000;
        for(int j=0; j<n; j++)
        {
            if(bdays[j] <= i)
            {
                if(i - bdays[j] < mhappiness)
                    mhappiness = i - bdays[j];
            }
            else
            {
                if(365 - (bdays[j] - i) < mhappiness)
                    mhappiness = 365 - (bdays[j] - i);
            }
        }
        
        if(mhappiness > maxHappiness)
        {
            bestDay = i;
            maxHappiness = mhappiness;
        }
    }
    
    for(int i=1; i<=300; i++)
    {
        int mhappiness = 1000000000;
        for(int j=0; j<n; j++)
        {
            if(bdays[j] <= i)
            {
                if(i - bdays[j] < mhappiness)
                    mhappiness = i - bdays[j];
            }
            else
            {
                if(365 - (bdays[j] - i) < mhappiness)
                    mhappiness = 365 - (bdays[j] - i);
            }
        }
        
        if(mhappiness > maxHappiness)
        {
            bestDay = i;
            maxHappiness = mhappiness;
        }
    }
    
    int m = -1;
    for(int i=0; i<12; i++)
    {
        if(monthBeforeDays[i] >= bestDay)
        {
            m = i;
            break;
        }
    }
    if(m == -1)
        m = 12;
    string omonth = to_string(m);
    if(m < 10)
        omonth = "0" + omonth;
    
    int ioday = bestDay - monthBeforeDays[m-1];
    
    string oday = to_string(ioday);
    //cout << ioday;
    if(ioday < 10)
        oday = "0" + oday;
    
    //cout << " check ";
    cout << omonth << "-" << oday;
}

منبع سوال‌: وب‌سایت کوئرا

 

اگر روش حل بهتری برای “تمرین تولد تاریخی” دارید برای ما ارسال کنید تا با نام خودتان به اشتراک بگذاریم. اگر سوال خاصی را مدنظر دارید در بخش نظرات برای ما ارسال کنید تا حل آن سوال را در الویت محتوای سایت بگذاریم.

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]