| ||||||||||
| 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