poj2785--4 Values whose Sum is 0 15秒的时间
我的思路是:把前两个数组枚举合并成一个大数组a,后两个数组枚举合并成一个大数组b,然后a数组从小到大排序,b数组从大到小排序,再循环压缩两个数组
用c++交tle 囧 ,g++ 6672MS 囧
View Code
1 //Accepted 49432K 6672MS G++ 1024B 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define MAX 4001 6 using namespace std; 7 int f[MAX][5],a[MAX*MAX],b[MAX*MAX]; 8 inline int cmp1(int a,int b) 9 { 10 return a>b; 11 } 12 inline int cmp2(int a,int b) 13 { 14 return a<b; 15 } 16 17 int main(void) 18 { 19 int n,i,j,p,q,ans,t,g,h; 20 while(scanf("%d",&n)!=EOF) 21 { 22 p = q = 0; 23 for(i=1;i<=n;i++) 24 for(j=1;j<=4;j++) 25 scanf("%d",&f[i][j]); 26 for(i=1;i<=n;i++) 27 { 28 for(j=1;j<=n;j++) 29 { 30 a[p++] = f[i][1] + f[j][2]; 31 b[q++] = f[i][3] + f[j][4]; 32 } 33 } 34 sort(a,a+p,cmp2); 35 sort(b,b+q,cmp1); 36 ans = 0; 37 j=0; 38 for(i=0;i<p && j < q;) 39 { 40 if(a[i] + b[j] > 0) 41 j++; 42 else if(a[i] + b[j] == 0) 43 { 44 g = 0; 45 for(t=i+1;t<p;t++) 46 if(a[t]==a[i]) 47 g++; 48 else 49 break; 50 h=0; 51 for(t=j+1;t<q;t++) 52 if(b[t]==b[j]) 53 h++; 54 else 55 break; 56 ++g; 57 ++h; 58 ans += g * h; 59 i=i+g; 60 j=j+h; 61 62 } 63 else 64 i++; 65 } 66 printf("%d\n",ans); 67 } 68 return 0; 69 }
注意这个数据
6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 结果是1296


浙公网安备 33010602011771号