| ||||||||||
| 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 | |||||||||
求测试数据 一时半会儿看不出来哪里错#include <iostream>
#include <algorithm>
#include <cstring>
#include <limits>
#include <queue>//!!!优先队列优化算法
using namespace std;
typedef struct FX
{
FX(int i = 0, int v = 0) :index(i), val(v) {};
int index;
int val;
}FX;
bool operator<(const FX &f1, const FX &f2)//优先队列比较
{
return f1.val < f2.val;
}
int dp[1000010];
int haveCow[1000010];
priority_queue<FX> fx;
int main()
{
int N, L, A, B;
while (cin >> N >> L >> A >> B)
{
//初始化
for (int i = 0; i <= L; ++i)
dp[i] = -1;
memset(haveCow, 0, sizeof(haveCow));
while (!fx.empty())//清空队列
fx.pop();
for (int i = 0; i < N; ++i)
{
int s, e;
cin >> s >> e;
for (int j = s + 1; j < e; ++j)
haveCow[j] = 1;
}
dp[0] = 0;
for (int i = 2 * A; i <= L; i += 2)//小于2*A的范围都不可达 奇数都不可达
{
int tmpIndex = i - 2 * A;//每次入队的下标:最近的有效点
if (dp[tmpIndex] != -1)
fx.push(FX(tmpIndex, dp[tmpIndex]));
if (!haveCow[i] && !fx.empty())
{
while (!fx.empty() && fx.top().index < i - 2 * B)//不在有效范围内的解出队
fx.pop();
if (!fx.empty())
dp[i] = fx.top().val + 1;
}
}
cout << dp[L] << endl;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator