#include <cstdio>
#include <algorithm>
#include "message.h"
#include "kanapka.h"
using namespace std;
long long l[105],p[105],cal[105],lp[105],t[10000000];
int main()
{
int a,b,c,d,e,f,g,n,ile,pp,k;
long long w,naj,naj2,cale,wyn;
n=GetN();
ile=(n+NumberOfNodes()-1)/NumberOfNodes();
pp=MyNodeId()*ile;
k=min(n,pp+ile);
naj=w=cale=0;
for (a=pp; a<k; a++)
{
t[a-pp]=naj;
c=GetTaste(a);
cale+=c;
w+=c;
naj=max(naj,w);
}
if (MyNodeId())
{
PutLL(0,cale);
PutLL(0,naj);
}
else
{
cal[0]=cale;
l[0]=naj;
}
naj2=naj;
w=naj=0;
for (a=k-1; a>=pp; a--)
{
c=GetTaste(a);
w+=c;
naj=max(naj,w);
naj2=max(naj2,t[a-pp]+naj);
}
if (MyNodeId())
{
PutLL(0,naj);
PutLL(0,naj2);
Send(0);
}
else
{
p[0]=naj;
lp[0]=naj2;
for (a=1; a<NumberOfNodes(); a++)
{
Receive(a);
cal[a]=GetLL(a);
l[a]=GetLL(a);
p[a]=GetLL(a);
lp[a]=GetLL(a);
}
w=wyn=0;
for (a=0; a<NumberOfNodes(); a++)
w+=cal[a];
wyn=max(w,wyn);
for (a=0; a<NumberOfNodes(); a++)
wyn=max(wyn,w-cal[a]+lp[a]);
for (a=0; a<NumberOfNodes(); a++)
for (b=NumberOfNodes()-1; b>a; b--)
{
w=0;
for (c=0; c<a; c++)
w+=cal[c];
w+=l[a];
for (c=NumberOfNodes()-1; c>b; c--)
w+=cal[c];
w+=p[b];
wyn=max(w,wyn);
}
printf ("%lld", wyn);
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <cstdio> #include <algorithm> #include "message.h" #include "kanapka.h" using namespace std; long long l[105],p[105],cal[105],lp[105],t[10000000]; int main() { int a,b,c,d,e,f,g,n,ile,pp,k; long long w,naj,naj2,cale,wyn; n=GetN(); ile=(n+NumberOfNodes()-1)/NumberOfNodes(); pp=MyNodeId()*ile; k=min(n,pp+ile); naj=w=cale=0; for (a=pp; a<k; a++) { t[a-pp]=naj; c=GetTaste(a); cale+=c; w+=c; naj=max(naj,w); } if (MyNodeId()) { PutLL(0,cale); PutLL(0,naj); } else { cal[0]=cale; l[0]=naj; } naj2=naj; w=naj=0; for (a=k-1; a>=pp; a--) { c=GetTaste(a); w+=c; naj=max(naj,w); naj2=max(naj2,t[a-pp]+naj); } if (MyNodeId()) { PutLL(0,naj); PutLL(0,naj2); Send(0); } else { p[0]=naj; lp[0]=naj2; for (a=1; a<NumberOfNodes(); a++) { Receive(a); cal[a]=GetLL(a); l[a]=GetLL(a); p[a]=GetLL(a); lp[a]=GetLL(a); } w=wyn=0; for (a=0; a<NumberOfNodes(); a++) w+=cal[a]; wyn=max(w,wyn); for (a=0; a<NumberOfNodes(); a++) wyn=max(wyn,w-cal[a]+lp[a]); for (a=0; a<NumberOfNodes(); a++) for (b=NumberOfNodes()-1; b>a; b--) { w=0; for (c=0; c<a; c++) w+=cal[c]; w+=l[a]; for (c=NumberOfNodes()-1; c>b; c--) w+=cal[c]; w+=p[b]; wyn=max(w,wyn); } printf ("%lld", wyn); } return 0; } |
English