Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:通过此题,我对poj彻底绝望了……In Reply To:通过此题,我对poj彻底绝望了…… Posted by:sanding at 2009-04-19 23:28:16 > 自己写的代码通过了自己的测试,却通不过poj的测试(貌似这也没什么) > 从网上找的其它两分代码能通过poj的测试,却通不过我的测试(原因很简单,它们的输出结果不一样。。。) > 我的WA程序至今原因不明,下面也贴出来让大家帮俺找找错。。谢谢 > > sanding:/mnt/3/shiyan/C/algorithm # ./island222 < island.txt > Case 1: 2 > Case 2: 1 > Case 3: 2 > Case 4: 1 > Case 5: 6 > Case 6: 2 > sanding:/mnt/3/shiyan/C/algorithm # ./island111 < island.txt > Case 1: 2 > Case 2: 2 > Case 3: 2 > Case 4: 2 > Case 5: 6 > Case 6: 2 > sanding:/mnt/3/shiyan/C/algorithm # cat island.txt > 3 2 > 0 0 > 1 2 > 4 0 > > 3 5 > 4 3 > 2 3 > 6 -9 > > 4 2 > 0 0 > 2 0 > 4 0 > 6 0 > > 2 1000000 > 1 1 > 1 -1 > > 17 5 > 3 4 > 4 3 > 4 5 > 4 4 > -1 2 > 4 1 > -4 0 > 3 3 > 3 5 > 26 2 > 3 1 > 0 0 > 0 1 > -1 3 > 19 5 > 11 4 > 12 -3 > > 4 2 > 1 1 > 1 -2 > 100 1 > 101 2 > > 0 0 > > 下面是那两个程序,大家可以贴上去试试。。。 > > island111.cpp : > > #include <stdio.h> > #include <string.h> > #include <algorithm> > #include <math.h> > using namespace std; > > const int N = 1000; > const double EPS = 1e-7; > > struct E { double a, b; } e[N]; > int n, d; > bool ava[N]; > double p[N]; > > inline int dblcmp(double a, double b) { > if( fabs(a-b) < EPS ) return 0; > if( a-b > 0 ) return 1; > return -1; > } > > bool operator<(const E& a, const E& b) { > if(dblcmp(a.a, b.a) == 0) > return dblcmp(a.b, b.b) == 1; > return dblcmp(a.a, b.a) == -1; > } > > > int main() { > int i, j, x, y; > int tc = 0; > while(scanf("%d %d", &n, &d), n + d) { > tc++; > int ok = 1; > for(i = 0; i < n; ++i) { > scanf("%d %d", &x, &y); > if(y > d) ok = 0; > double offset = sqrt ( d * d - y * y ); > e[i].a = x - offset, e[i].b = x + offset; > ava[i] = 1; > } > if(!ok) { printf("Case %d: -1\n", tc); continue; } > sort(e, e + n); > int stack[N], top = 0; > stack[top++] = 0; > for(i = 1; i < n; ++i) { > while(top > 0 && dblcmp(e[stack[top-1]].b, e[i].b) != -1) { > ava[stack[--top]] = 0; > } > stack[top++] = i; > } > > for(i = 0; !ava[i]; ++i); > p[i] = e[i].b; > int cnt = 1; > for(i = i+1; i < n; ++i) if(ava[i]) { > for(j = i-1; !ava[j]; j--); > if(p[j] >= e[i].a) p[i] = p[j]; > else { p[i] = e[i].b; cnt++; } > } > printf("Case %d: %d\n", tc, cnt); > } > return 0; > } > > > island222.cpp : > > #include<iostream> > #include<cmath> > using namespace std; > > const int MAX = 1003; > struct coordinate > { > int x; > int y; > }island[MAX]; > > struct a > { > double left; > double right; > }area[MAX]; > > /* > 按left升序排序 > */ > void Sorted(a* area) > { > double left,right; > for(int i=1;i<area[0].left;i++) > { > for(int j=1;j<=area[0].left-i;j++) > { > if (area[j].left - area[j+1].left > 0) > { > left = area[j].left; > right = area[j].right; > area[j].left = area[j+1].left; > area[j].right = area[j+1].right; > area[j+1].left = left; > area[j+1].right = right; > } > } > } > } > > int Calculate(a* area) > { > int count=1; > double left = area[1].left; > double right = area[1].right; > for(int i=2;i<=area[0].left;i++) > { > if (area[i].left > right) > { > count++; > right = area[i].right; > } > else > { > if (area[i].right < right) > right = area[i].right; > } > } > return count; > } > int main() > { > int n,d,dd,nCase; > cin>>n>>d; > nCase = 1; > bool solution = true; > > while(n != 0 || d != 0) > { > island[0].x = n;//岛屿的个数 > solution = true; > for(int i=1;i<=n;i++) > { > cin>>island[i].x>>island[i].y; > if (island[i].y > d) > solution = false; > } > if (solution == false || n <= 0 || d <= 0) > cout<<"Case "<<nCase<<": "<<-1<<endl; > else > { > //算出每个岛可安雷达的最左边坐标和最右边坐标 > area[0].left = n; > double a; > dd = d*d; > for(int j=1;j<=area[0].left;j++) > { > a = sqrt(double(dd-island[j].y*island[j].y)); > area[j].left = island[j].x - a; > area[j].right = island[j].x + a; > } > Sorted(area); > cout<<"Case "<<nCase<<": "<<Calculate(area)<<endl; > } > cin>>n>>d; > nCase++; > > } > > return 0; > } > > > 我的WA程序。。。 > #include <stdio.h> > #include <stdlib.h> > #include <math.h> > > #define MAXISLAND 1000 > #define POW(a) (a)*(a) > > struct xy { > int x, y; > } xy[MAXISLAND]; > > int compare(const void *a, const void *b) > { > return (*(struct xy *)a).x - (*(struct xy *)b).x; > } > > int main() > { > int island_n, radar_n, d, i, n = 0, no; > double right_min, right; > while (scanf("%d %d", &island_n, &d) != EOF && island_n) { > n++, no = 0, radar_n = 0; > > if(d <= 0) { > printf("Case %d: -1\n", n); > break; > } > > for (i = 0; i < island_n; i++) > scanf("%d %d", &(xy[i].x), &(xy[i].y)); > scanf("\n"); > > qsort(xy, island_n, sizeof(struct xy), compare); > > i = 0; > while (i < island_n) { > if (abs(xy[i].y) > d) { > no = 1; > printf("Case %d: -1\n", n); > goto noo; > } > > right_min = xy[i].x + sqrt(POW(d) - POW(xy[i].y)); > radar_n++; > > for (i++; i < island_n; i++) { > if (abs(xy[i].y) > d) { > no = 1; > printf("Case %d: -1\n", n); > goto noo; > } > if (xy[i].x - sqrt(POW(d) - POW(xy[i].y)) - right_min > 0.00001) > break; > right = xy[i].x + sqrt(POW(d) - POW(xy[i].y)); > right_min = right_min - right > 0.00001 ? right : right_min; > } > } > > noo: if (!no) > printf("Case %d: %d\n", n, radar_n); > } > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator