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
posted @ 2012-08-23 22:08  Wheat″  阅读(129)  评论(0)    收藏  举报