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
| #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<stack> #include<cmath> #include<set> #include<bitset> #include<complex> #include<assert.h> #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,l,r) for(int i=l;i>=r;i--) #define link(x) for(edge *j=h[x];j;j=j->next) #define mem(a) memset(a,0,sizeof(a)) #define ll long long #define eps 1e-8 #define succ(x) (1<<x) #define lowbit(x) (x&(-x)) #define sqr(x) ((x)*(x)) #define mid (x+y)/2 #define NM 100005 #define nm 105 using namespace std; const double pi=acos(-1); const int inf=1e9+7; ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; }
int n,tot,a[10][10],d[64][185][185],_ans,ans; void upd(int&x,int y){if(y<x)x=y;}
int main(){ n=6;tot=63; int _=read();while(_--){ inc(i,1,n)inc(j,1,7)a[i][j]=read(); inc(p,0,tot)inc(i,0,180)inc(j,0,180)d[p][i][j]=inf; d[0][0][0]=ans=_ans=0; inc(p,0,tot)inc(i,0,180)inc(j,0,180)if(d[p][i][j]<=180){ inc(k,1,n)if(!(p&succ(k-1))){ int t=p|succ(k-1),v; v=i+a[k][1];if(v<=180)upd(d[t][v][j],d[p][i][j]); v=j+a[k][2];if(v<=180)upd(d[t][i][v],d[p][i][j]); v=d[p][i][j]+a[k][3];if(v<=180)upd(d[t][i][j],v); v=max(i,j)+a[k][4];if(v<=180)upd(d[t][v][v],d[p][i][j]); v=max(i,d[p][i][j])+a[k][5];if(v<=180)upd(d[t][v][j],v); v=max(j,d[p][i][j])+a[k][6];if(v<=180)upd(d[t][i][v],v); v=max(max(i,j),d[p][i][j])+a[k][7];if(v<=180)upd(d[t][v][v],v); } int t=__builtin_popcount(p); if(t>ans)ans=t,_ans=max(max(i,j),d[p][i][j]); else if(ans==t)_ans=min(_ans,max(max(i,j),d[p][i][j])); } printf("%d %d\n",ans,_ans); } return 0; }
|