| ||||||||||
| 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 | |||||||||
贴个代码,并提示一下可能错的一个地方
//注意:在输入岛的位置时,即使发现了一个岛不可能被覆盖到,也要继续把此次数据接收完
//这个代码用2个堆对岛的左交点和右交点分别排序,再利用贪心法求解
#include <math.h>
#include <iostream>
using namespace std;
struct Position
{
int x;
int y;
}posi;
int N = 0, D = 0;
int heap1_size = 0;
int heap2_size = 0;
struct Situ
{
double p1;
double p2;
short num;
}heap1[1003], heap2[1003];
bool dp[1003];
void heap1_push(Situ a);
void heap1_pop();
void heap2_push(Situ a);
void heap2_pop();
int main()
{
double m = 0;
double lasttower;
Situ mSitu;
int case_number = 1;
bool IsImposible = false;
while (true)
{
scanf_s("%d%d", &N, &D);
heap2_size = 0;
heap1_size = 0;
memset(dp, 0, sizeof(dp));
memset(heap1, 0, sizeof(heap1));
memset(heap2, 0, sizeof(heap2));
IsImposible = false;
if (N == 0)
{
return 0;
}
for (int i = 0; i < N; i++)
{
scanf_s("%d%d", &posi.x, &posi.y);
if (posi.y > D)
{
IsImposible = true;
}
mSitu.num = i;
if (!IsImposible)
{
m = sqrt((double)D*D - posi.y*posi.y);
}
mSitu.p1 = posi.x - m;
mSitu.p2 = posi.x + m;
heap1_push(mSitu);
m = mSitu.p1;
mSitu.p1 = mSitu.p2;
mSitu.p2 = m;
heap2_push(mSitu);
}
if (IsImposible)
{
printf_s("Case %d: -1\n", case_number);
case_number++;
continue;
}
lasttower = heap2[0].p1;
dp[0] = true;
int Answer = 1;
while (true)
{
while (heap1[0].p1 <= lasttower)
{
dp[heap1[0].num] = true;
N--;
if (!N)
{
printf_s("Case %d: %d\n", case_number, Answer);
break;
}
heap1_pop();
}
if (!N)
{
break;
}
while (dp[heap2[0].num])
{
heap2_pop();
}
dp[heap2[0].num] = true;
lasttower = heap2[0].p1;
Answer++;
}
case_number++;
}
return 0;
}
void heap1_push(Situ a)
{
static Situ ls;
static int fa;
static int m;
m = heap1_size;
heap1[m] = a;
heap1_size++;
while (m)
{
fa = (m - 1) / 2;
if (heap1[fa].p1 > heap1[m].p1)
{
ls = heap1[fa];
heap1[fa] = heap1[m];
heap1[m] = ls;
}
else
{
break;
}
m = fa;
}
return;
}
void heap1_pop()
{
static Situ ls;
static int son;
static int m;
heap1_size--;
heap1[0] = heap1[heap1_size];
m = 0;
while (2 * m + 1 < heap1_size)
{
son = 2 * m + 1;
if ((heap1[son].p1 > heap1[son + 1].p1) && (son + 1 < heap1_size))
{
son++;
}
if (heap1[son].p1 < heap1[m].p1)
{
ls = heap1[son];
heap1[son] = heap1[m];
heap1[m] = ls;
}
else
{
break;
}
m = son;
}
return;
}
void heap2_push(Situ a)
{
static Situ ls;
static int fa;
static int m;
m = heap2_size;
heap2[m] = a;
heap2_size++;
while (m)
{
fa = (m - 1) / 2;
if (heap2[fa].p1 > heap2[m].p1)
{
ls = heap2[fa];
heap2[fa] = heap2[m];
heap2[m] = ls;
}
else
{
break;
}
m = fa;
}
return;
}
void heap2_pop()
{
static Situ ls;
static int son;
static int m;
heap2_size--;
heap2[0] = heap2[heap2_size];
m = 0;
while (2 * m + 1 < heap2_size)
{
son = 2 * m + 1;
if ((heap2[son].p1 > heap2[son + 1].p1) && (son + 1 < heap2_size))
{
son++;
}
if (heap2[son].p1 < heap2[m].p1)
{
ls = heap2[son];
heap2[son] = heap2[m];
heap2[m] = ls;
}
else
{
break;
}
m = son;
}
return;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator