您的位置:首页 > 其它

USCAO Section 1.1 Milking Cows

2012-04-27 20:46 507 查看
MilkingCows

Threefarmersriseat5ameachmorningandheadforthebarntomilkthreecows.Thefirstfarmerbeginsmilkinghiscowattime300(measuredinsecondsafter5am)andendsattime1000.Thesecondfarmerbeginsattime700andendsattime1200.The
thirdfarmerbeginsattime1500andendsattime2100.Thelongestcontinuoustimeduringwhichatleastonefarmerwasmilkingacowwas900seconds(from300to1200).Thelongesttimenomilkingwasdone,betweenthebeginningandtheendingofallmilking,
was300seconds(1500minus1200).

YourjobistowriteaprogramthatwillexaminealistofbeginningandendingtimesforN(1<=N<=5000)farmersmilkingNcowsandcompute(inseconds):

Thelongesttimeintervalatleastonecowwasmilked.
Thelongesttimeinterval(aftermilkingstarts)duringwhichnocowswerebeingmilked.

PROGRAMNAME:milk2

INPUTFORMAT

Line1:Thesingleinteger
Lines2..N+1:Twonon-negativeintegerslessthan1000000,thestartingandendingtimeinsecondsafter0500

SAMPLEINPUT(filemilk2.in)

3
3001000
7001200
15002100

OUTPUTFORMAT

Asinglelinewithtwointegersthatrepresentthelongestcontinuoustimeofmilkingandthelongestidletime.

SAMPLEOUTPUT(filemilk2.out)

900300

困扰了我许多天,今天心平气静,两下就AC了


/*
ID:nealgav1
PROG:milk2
LANG:C++
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#defineN1000005
usingnamespacestd;

class_cow
{
public:
intstart,end;
};
_cowcow
;

boolcmp(_cowa,_cowb)
{
if(a.start==b.start)
returna.end<b.end;
returna.start<b.start;

}
intmain()
{
freopen("milk2.in","r",stdin);
freopen("milk2.out","w",stdout);
intm;
while(cin>>m)
{
for(inti=0;i<m;i++)
{
cin>>cow[i].start>>cow[i].end;
}
sort(cow,cow+m,cmp);

intansmax=0,anspause=0;
intnext=0;//记录下一个
for(inti=1;i<m;i++)
{
if(cow[i].start<=cow[next].end)
{

if(cow[i].end>cow[next].end)
{
cow[next].end=cow[i].end;
ansmax=max(ansmax,cow[next].end-cow[next].start);
}
}
else
{
cow[++next].end=cow[i].end;//next指针后移一位
cow[next].start=cow[i].start;
anspause=max(cow[next].start-cow[next-1].end,anspause);
ansmax=max(ansmax,cow[next].end-cow[next].start);
}
}
ansmax=max(ansmax,cow[0].end-cow[0].start);
cout<<ansmax<<""<<anspause<<endl;
}
}

[/code]

MilkingCows

Wereadthelistoftimes,sortitbystarttime,andthenwalkoverthelist
once,mergingoverlappingtimes.Thenwewalkthelistwatchingforlongmilking
periodsandlongnon-milkingperiods.

Analternateapproachwouldbetojustkeepanarrayofsizeamillionand
markofftimes.Onanicefastprocessor,that'sprobablyfastenough,butour
abovealgorithmwillworkevenonslowprocessors,andit'snotmuchharderto
write.
[code]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#defineMAXMILKING5000

typedefstructMilking Milking;
structMilking{
intbegin;
intend;
};

Milkingmilking[MAXMILKING];
intnmilking;

int
milkcmp(constvoid*va,constvoid*vb)
{
Milking*a,*b;

a=(Milking*)va;
b=(Milking*)vb;

if(a->begin>b->begin)
return1;
if(a->begin<b->begin)
return-1;
return0;
}

void
main(void)
{
FILE*fin,*fout;
inti,j,t,tmilk,tnomilk;
Milkingcur;

fin=fopen("milk2.in","r");
fout=fopen("milk2.out","w");
assert(fin!=NULL&&fout!=NULL);

/*readinput,sort*/
fscanf(fin,"%d",&nmilking);
for(i=0;i<nmilking;i++)
fscanf(fin,"%d%d",&milking[i].begin,&milking[i].end);

qsort(milking,nmilking,sizeof(Milking),milkcmp);

/*walkoverlist,lookingforlongperiodsoftime*/
/*tmilk=longestmilkingtime*/
/*tnomilk=longestnon-milkingtime*/
/*cur=currentspanofmilkingtimebeingconsidered*/

tmilk=0;
tnomilk=0;
cur=milking[0];
for(i=1;i<nmilking;i++){
if(milking[i].begin>cur.end){ /*adowntime*/
t=milking[i].begin-cur.end;
if(t>tnomilk)
tnomilk=t;

t=cur.end-cur.begin;
if(t>tmilk)
tmilk=t;

cur=milking[i];
}else{
if(milking[i].end>cur.end)
cur.end=milking[i].end;
}
}

/*checkfinalmilkingperiod*/
t=cur.end-cur.begin;
if(t>tmilk)
tmilk=t;

fprintf(fout,"%d%d\n",tmilk,tnomilk);
exit(0);
}

AnotherIdea(fromJesseRuderman)

Thesolutiongivenformilk2sortsmilkingperiodsbystartandthenwalksthroughthem.Thesolutionpagealsomentionsasecondpossiblesolutioninvolvingahugearray.Here'sathirdsolutionthatsortsstartingandstoppingtimestogether,andwalksthroughthe"events"offarmersstartingandstoppingtomilk.
/*sortthestartingandendingtimes,thengothroughthemfrom
starttofinish,keepingtrackofhowmanyfarmersaremilking
betweeneach"event"(asinglefarmerstartingandstopping).*/

#include<fstream.h>
#include<stdlib.h>

structevent
{
longseconds;/*secondssince5am*/
signedcharss;/*start=1,stop=-1(deltanumberoffarmersmilking)
*/
};

inteventcmp(constevent*a,constevent*b)
{
if(a->seconds!=b->seconds)
return(a->seconds-b->seconds);/*300before500*/

return(b->ss-a->ss);/*1(start)before-1(stop)*/
}

intmain()
{
ifstreamin;
ofstreamout;

in.open("milk2.in");
out.open("milk2.out");

intnum_intervals,num_events,i;
eventevents[5000*2];

in>>num_intervals;
num_events=num_intervals*2;
for(i=0;i<num_intervals;++i)
{
in>>events[2*i].seconds;events[2*i].ss=1;
in>>events[2*i+1].seconds;events[2*i+1].ss=-1;
}

qsort(events,num_events,sizeof(event),
(int(*)(constvoid*,constvoid*))eventcmp);

/*for(i=0;i<num_events;++i)
out<<events[i].seconds
<<(events[i].ss==1?"start":"stop")<<endl;*/

intnum_milkers=0,was_none=1;
intlongest_nomilk=0,longest_milk=0;
intistart,ilength;

for(i=0;i<num_events;++i)
{
num_milkers+=events[i].ss;

if(!num_milkers&&!was_none)
{
/*therearesuddenlynomilkers.*/
ilength=(events[i].seconds-istart);
if(ilength>longest_milk)
longest_milk=ilength;
istart=events[i].seconds;
}
elseif(num_milkers&&was_none)
{
/*therearesuddenlymilkers.*/
if(i!=0)
{
ilength=(events[i].seconds-istart);
if(ilength>longest_nomilk)
longest_nomilk=ilength;
}
istart=events[i].seconds;
}

was_none=(num_milkers==0);
}

out<<longest_milk<<""<<longest_nomilk<<endl;

return0;

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: