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

感谢各位的提示,其实是不用考虑y和d是不是小于0,无解时只用判断y>d就行了,即使d小于0也考虑在内了

Posted by lzs12348 at 2012-06-30 23:15:12 on Problem 1328
感谢各位的提示,其实是不用考虑y和d是不是小于0,无解时只用判断y>d就行了,即使d小于0也考虑在内了
刚开始思路完全错了,以为是要先取y值最大的点的x坐标作为雷达坐标,看了贪心的思路后才做出来的。

贴上AC代码:756K	32MS   G++

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int n, d, cnt, casecnt = 1;

typedef struct
{
	int x, y;
	double x1, x2;
} point;
vector<point> islands(1010);

void solve();

int main()
{
//	freopen("input", "r", stdin);
	ios::sync_with_stdio(false);
	
	while (cin >> n >> d && n != 0) {
		islands.resize(n);
		for (int i = 0; i < n; i++) 
			cin >> islands[i].x >> islands[i].y;
		solve();
	}

//	fclose(stdin);
	return 0;
}

class cmp
{
	public:
		bool operator() (const point& lhs, const point& rhs)
		{ return lhs.x < rhs.x; }
};
void solve()
{
	cnt = 0;
	cmp mycmp;
	sort(islands.begin(), islands.begin() + n, mycmp);
	double nowx = -99999999, x1, x2;
	for (int i = 0; i < n; i++) {
		if (islands[i].y > d) {
			cout << "Case " << casecnt++ << ": -1" << endl;
			return ;
		}
		else {
			double tmp = sqrt(d * d - islands[i].y * islands[i].y);
			x1 = islands[i].x - tmp;
			x2 = islands[i].x + tmp;
			if (x1 <= nowx)	
				nowx = (nowx < x2) ? nowx : x2;
			else { 
				cnt++; 
				nowx = x2; 
			}
		}
	}
	cout << "Case " << casecnt++ << ": " << cnt << endl;
}

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