-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathsuma4.cpp
61 lines (60 loc) · 1.5 KB
/
suma4.cpp
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
# include <cstdio>
# include <algorithm>
using namespace std;
int i,j,n,m,x,y,VV,S,nr,o,q,lv,cv,rez,I,la,ca,Vact;
int a[65005], mat[60][60][60];
int dx[]={0,0,1,1};
int dy[]={0,1,0,1};
int main ()
{
freopen ("suma4.in", "r", stdin);
freopen ("suma4.out", "w", stdout);
scanf ("%d", &n);
for (i=1; i<=n; ++i)
scanf ("%d", &a[i]);
for (i=1; i<=60; ++i)
{
if (i*(i+1)*(2*i+1)/6==n) {VV=i; break;}
}
rez=n-VV*VV;
for (i=1; i<=VV; ++i)
for (j=1; j<=VV; ++j)
{
nr=rez+(i-1)*VV+j;
mat[i][j][VV]=a[nr];
}
for (q=VV-1; q>=1; --q)
{
rez=rez-q*q;
for (i=1; i<=q; ++i)
for (j=1; j<=q; ++j)
{
nr=rez+(i-1)*q+j;
for (o=0; o<4; ++o)
{
lv=i+dx[o]; cv=j+dy[o];
if (mat[i][j][q]==0 || mat[lv][cv][q+1]+a[nr]<mat[i][j][q])
mat[i][j][q]=mat[lv][cv][q+1]+a[nr];
}
}
}
printf ("%d %d\n1 ", VV, mat[1][1][1]);
la=1; ca=1; Vact=1; rez=0;
while (Vact<VV)
{
nr=rez+(la-1)*Vact+ca;
for (o=0; o<4; ++o)
{
lv=la+dx[o]; cv=ca+dy[o];
if (mat[la][ca][Vact]-a[nr]==mat[lv][cv][Vact+1])
{
rez+=Vact*Vact;
++Vact; la=lv; ca=cv;
nr=rez+(la-1)*Vact+ca;
printf ("%d ", nr);
break;
}
}
}
return 0;
}