Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

通过此题,我对poj彻底绝望了……

Posted by sanding at 2009-04-19 23:28:16 on Problem 1328
自己写的代码通过了自己的测试,却通不过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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator