一开始用dfs做,老是过不了样例,原来数组是a[N][4],mark[N][4]被我写成了a[4][N],mark[4][N].哎
不过最后改过来交了还是超时了,妈的 dfs 超时,二分那种蠢逼做法不超时,无语。
dfs
1 #include<queue> 2 #include<math.h> 3 #include<stdio.h> 4 #include<string.h> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 #define N 115 9 10 int a[N][4]; 11 int mark[N][4]; 12 int n,cnt,sum; 13 14 void dfs(int x,int s) 15 { 16 if(x==4) 17 { 18 if(s==0) 19 { 20 cnt++; 21 return; 22 } 23 else 24 { 25 return; 26 } 27 } 28 for(int i=0;i<n;i++) 29 { 30 int ss=s; 31 if(!mark[i][x]) 32 { 33 ss+=a[i][x]; 34 mark[i][x]=1; 35 dfs(x+1,ss); 36 mark[i][x]=0; 37 } 38 } 39 } 40 41 int main() 42 { 43 while(~scanf("%d",&n)) 44 { 45 memset(mark,0,sizeof(mark)); 46 cnt=sum=0; 47 for(int i=0;i<n;i++) 48 scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]); 49 50 dfs(0,0); 51 printf("%d ",cnt); 52 } 53 return 0; 54 }
时间要求是15000MS,没注意,用二分暴力做,把前两组数的亮亮组合都搞出来,后两组也搞出来加一个符号,然后看有多少相等的,就是答案
#include<queue> #include<math.h> #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define N 4123 int a[N][4]; int num1[N*N],num2[N*N]; int n,cnt,sum; int erfen(int x) { int num,mid,l=0,r=n*n-1; while(l<=r) { mid=(l+r)/2; if(num2[mid]==x) { num=1; for(int i=mid-1;num2[i]==x&&i>=0;i--) num++; for(int i=mid+1;num2[i]==x&&i<n*n;i++) num++; return num; } else if(num2[mid]<x) { l=mid+1; } else { r=mid-1; } } return 0; } int main() { while(~scanf("%d",&n)) { cnt=0; for(int i=0;i<n;i++) scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]); int k=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { num1[k]=a[i][0]+a[j][1]; num2[k++]= -(a[i][2]+a[j][3]); } sort(num2,num2+k); for(int i=0;i<k;i++) { cnt+=erfen(num1[i]); } printf("%d ",cnt); } return 0; }
开始没注意是a[N][4]不是a[4][N]导致wa了几发,但是这不应该是数组越界吗,却给我wa,不明白
hash的做法以后再学