مشکل در usaco

fakad

Member
ارسال ها
94
لایک ها
12
امتیاز
8
#1
سوال milk2:
سوال از این قراره که n تا آدم تو n بازه زمانی شیر میدوشن.حالا میخوایم ببینیم که بیشترین بازه زمانی که توش حداقل 1 نفرشیر دوشیده و بیشترین بازه که توش شیری دوشیده نشده رو پیدا کنیم.
برنامه من واسه 6 تا تست درسته ولی واسه هفتمی غلطه کسی میدونه چرا؟؟؟؟؟
کد
#include<iostream>
#include<fstream>

using namespace std;

void shift(int* a,int time,int start,int n)
{
    for(int i=0;i<time;i++)
    {
        for(int j=n;j>=start;j--)
            a[j]=a[j-1];
        n++;
    }
}

int main()
{
    ifstream fin("milk2.in");
    ofstream fout("milk2.out");
    int n;
    int times[6000]={0};
    int s,e;
    int start[2],end[2];
    int noot=1;
    times[0]=-2;
    times[1]=99999999999;
    fin>>n;
    for(int q=0;q<n;q++)
    {
        fin>>s>>e;
        for(int i=0;i<=noot;i++)
        {
            if(s>=times[i])
            {
                start[0]=i;
                start[1]=i+1;
            }
            if(e>=times[i])
            {
                end[0]=i;
                end[1]=i+1;
            }
        }
        if(end[0]==start[0])
        {
            if(end[0]%2==0)
            {
                shift(times,2,end[0]+1,noot+1);
                times[end[0]+1]=s;
                times[end[0]+2]=e;
                noot+=2;
            }
        }
        else
        {
            if(start[1]==end[0])
            {
                if(start[1]%2==1)
                    times[start[1]]=s;
                else
                    times[start[1]]=e;
            }
            else
            {
                if(start[1]%2==1)
                    times[start[1]]=s;
                if(end[0]%2==0)
                    times[end[0]]=e;
            }
            for(int i=start[1]+1;i<end[1]-1;i++)
                times[i]=-1;
        }
        int help=noot;
            for(int i=1;i<noot;i++)
            {
                if(times[i]==-1)
                {
                        for(int j=i;j<noot;j++)
                            times[j]=times[j+1];
                        i--;
                        help--;
                }
            }
            noot=help;
    }
    
    for(int i=2;i<noot-1;i+=2)
        if(times[i]==times[i+1])
            times[i]=times[i+1]=-1;
            
    int help=noot;
    for(int i=1;i<noot;i++)
    {
        if(times[i]==-1)
        {
            for(int j=i;j<noot;j++)
                times[j]=times[j+1];
            i--;
            help--;
        }
    }
    noot=help;
    int max1=0,max2=0;
    for(int i=1;i<noot-1;i+=2)
    {
        if(times[i+1]-times[i]>max1)
            max1=times[i+1]-times[i];
    }
    for(int i=2;i<noot-1;i+=2)
    {
        if(times[i+1]-times[i]>max2)
            max2=times[i+1]-times[i];
    }
    fout<<max1<<" "<<max2<<endl;
    return 0;
}
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
#2
پاسخ : مشکل در usaco

کدت خیلی طولانی و نامفهومه !؟ می شه بگی الگوریتمت چیه ؟
 

fakad

Member
ارسال ها
94
لایک ها
12
امتیاز
8
#3
پاسخ : مشکل در usaco

رمان ها رو در یک آرایه میریزه.درایه های با اندیس فرد شروع یک بازه و درایه های با اندیس زوج پایان بازه اند.
شماره 0 آرایه (اولین درایه) 0 هست و زمان ها از اونجا به بعده. آخرین درایه هم که زمان ها تا قبل از اون میان با noot نمایش داده شده و توش یه عدد گنده ریختم.
هربار شروع بازه زمانی جدید رو تو s و پایانشو تو e میگیرم و داخل آرایه میریزم به صورت نشان داده شده.
اینجا کلیلک کنید تا با عکس ببینید.
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
#4
پاسخ : مشکل در usaco

الآن این ورودی رو به برنامت بدی ، خروجیت اشتباهه ...

4
1 3
3 7
9 10 1 10
=========== تا اونجایی که من فهمیدم ، آرایه ها رو مرتب نمی کنی؟ درسه؟
بعدشم برای زمان ها می تونی از یه pair استفاده کنی که کدت خیلی خوشگل تر می شه ...
من خودم برای حل این سوال 1 روز وقت گذاشتم (یه گیرایی داره یه جاهایی که اعصاب خورد کنه ...)
 
آخرین ویرایش توسط مدیر

fakad

Member
ارسال ها
94
لایک ها
12
امتیاز
8
#5
پاسخ : مشکل در usaco

الآن این ورودی رو به برنامت بدی ، خروجیت اشتباهه ...

4
1 3
3 7
9 10 1 10
=========== تا اونجایی که من فهمیدم ، آرایه ها رو مرتب نمی کنی؟ درسه؟
بعدشم برای زمان ها می تونی از یه pair استفاده کنی که کدت خیلی خوشگل تر می شه ...
من خودم برای حل این سوال 1 روز وقت گذاشتم (یه گیرایی داره یه جاهایی که اعصاب خورد کنه ...)

کدمو اصلاح کردم ولی باز تو تست 7 غلطه.دیگه دارم دیوونه میشم.
کد
#include<iostream>
#include<fstream>

using namespace std;

void shift(int* a,int time,int start,int n)
{
    for(int i=0;i<time;i++)
    {
        for(int j=n;j>=start;j--)
            a[j]=a[j-1];
        n++;
    }
}

int main()
{
    ifstream fin("milk2.in");
    ofstream fout("milk2.out");
    int n;
    int times[6000]={0};
    int s,e;
    int start[2],end[2];
    int noot=1;
    times[0]=-2;
    times[1]=99999999999;
    fin>>n;
    for(int q=0;q<n;q++)
    {
        fin>>s>>e;
        for(int i=0;i<=noot;i++)
        {
            if(s>=times[i])
            {
                start[0]=i;
                start[1]=i+1;
            }
            if(e>=times[i])
            {
                end[0]=i;
                end[1]=i+1;
            }
        }
        if(end[0]==start[0])
        {
            if(end[0]%2==0)
            {
                shift(times,2,end[0]+1,noot+1);
                times[end[0]+1]=s;
                times[end[0]+2]=e;
                noot+=2;
            }
        }
        else
        {
            int sec=0;
            if(start[1]==end[0])
            {
                if(start[1]%2==1)
                {
                    times[start[1]]=s;
                    sec=1;
                }
                else
                    times[start[1]]=e;
            }
            else
            {
                if(start[1]%2==1)
                {
                    times[start[1]]=s;
                    sec=1;
                }
                if(end[0]%2==0)
                    times[end[0]]=e;
            }
            if(sec==1)
                for(int i=start[1]+1;i<end[1]-1;i++)
                    times[i]=-1;
            else
                for(int i=start[1];i<end[1]-1;i++)
                    times[i]=-1;
        }
            for(int i=2;i<noot-1;i+=2)
        if(times[i]==times[i+1])
            times[i]=times[i+1]=-1;
        int help=noot;
            for(int i=1;i<noot;i++)
            {
                if(times[i]==-1)
                {
                        for(int j=i;j<noot;j++)
                            times[j]=times[j+1];
                        i--;
                        help--;
                }
            }
            noot=help;
    }
            
    int help=noot;
    for(int i=1;i<noot;i++)
    {
        if(times[i]==-1)
        {
            for(int j=i;j<noot;j++)
                times[j]=times[j+1];
            i--;
            help--;
        }
    }
    noot=help;
    int max1=0,max2=0;
    for(int i=1;i<noot-1;i+=2)
    {
        if(times[i+1]-times[i]>max1)
            max1=times[i+1]-times[i];
    }
    for(int i=2;i<noot-1;i+=2)
    {
        if(times[i+1]-times[i]>max2)
            max2=times[i+1]-times[i];
    }
    fout<<max1<<" "<<max2<<endl;
    return 0;
}
 
بالا