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

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

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

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

 

در مورد سایت کوئرا بیشتر بخوانید…

 

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

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

اما حیدری به روز دقیق تولد اعتقادی ندارد و می‌خواهد جوری تولد بگیرد که همه یک عالمه خوشحال شوند.

حیدری لیست تاریخ تولد همه دوستانش را دارد و می‌داند که همه دوستانش در جعبه فکر می‌کنند. بخاطر همین همه دوستانش دقیقاً در روز تولد خودشان مهمانی می‌گیرند.

تو جهان خارج جعبه‌ی حیدری تقویم میلادی برقرار و امروز ۲۷ اکتبر است. تو این تقویم سال کبیسه وجود ندارد.

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

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

تقویم میلادی
تقویم میلادی

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

به حیدری کمک کنید بهترین روز را برای برگزاری مهمانی تولد انتخاب کند.

 

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

در خط اول ورودی  تعداد دوستان حیدری می‌آید. سپس در 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]