#include<cstdio> int k[2001][2001]; const int max=1000000001; int n; int minx(int y, int xl, int xp, int&x){ int m=max; for(register int ix=xp;ix>=xl;ix--)if(k[y][ix]<m) m=k[y][ix],x=ix; return m; } int min(int p, int&x, int&y) { int m=max,tx,tm; x=-1; for (int i=0;i<=p;i++) {tm=minx(i,p,n-1,tx);if (tm<m)m=tm,x=tx,y=i;} return m; } main(){ scanf("%d",&n); for(int i=0;i<n;i++) for (int j=i,x;j<n;j++) scanf("%d",&x), k[i][j]=x,k[j][i]=x; long long w=0;int x,y; for (int i=0;i<n;i++) { w+=min(i,x,y); if (x>i){k[y][x]=max;k[x][y]=max;k[y][x]=k[x][y]=minx(i,0,i,x);} } printf("%lld\n",w); } // napisane na szybko, moze beda 2 punkty :-)
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 | #include<cstdio> int k[2001][2001]; const int max=1000000001; int n; int minx(int y, int xl, int xp, int&x){ int m=max; for(register int ix=xp;ix>=xl;ix--)if(k[y][ix]<m) m=k[y][ix],x=ix; return m; } int min(int p, int&x, int&y) { int m=max,tx,tm; x=-1; for (int i=0;i<=p;i++) {tm=minx(i,p,n-1,tx);if (tm<m)m=tm,x=tx,y=i;} return m; } main(){ scanf("%d",&n); for(int i=0;i<n;i++) for (int j=i,x;j<n;j++) scanf("%d",&x), k[i][j]=x,k[j][i]=x; long long w=0;int x,y; for (int i=0;i<n;i++) { w+=min(i,x,y); if (x>i){k[y][x]=max;k[x][y]=max;k[y][x]=k[x][y]=minx(i,0,i,x);} } printf("%lld\n",w); } // napisane na szybko, moze beda 2 punkty :-) |