比赛 |
20100913 |
评测结果 |
AAAAAAAAAA |
题目名称 |
越狱 |
最终得分 |
100 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2010-09-13 20:34:52 |
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct station
{
int d,w;
}P[20001];
int cmp(const void *a,const void *b)
{
station *aa=(station *)a;
station *bb=(station *)b;
return bb->d - aa->d;
}
int n;
int f[2][20001];
bool y[2][20001];
int main()
{
freopen("prisonbreak.in","r",stdin);
freopen("prisonbreak.out","w",stdout);
scanf("%d",&n);n++;
for (int i=n-1;i>=0;i--) scanf("%d%d",&P[i].d,&P[i].w);
qsort(P,n+1,sizeof(P[0]),cmp);
f[0][0]=P[0].w;y[0][0]=true;
for (int i=1;i<=n;i++)
{
int t=i & 1;
memset(f[t],0,sizeof(f[t]));
memset(y[t],0,sizeof(y[t]));
for (int j=i-1;j>=0 && y[1-t][j] && f[1-t][j]-(P[i-1].d-P[i].d)>=0;j--)
{
if (f[t][j]<f[1-t][j]-(P[i-1].d-P[i].d))
f[t][j]=f[1-t][j]-(P[i-1].d-P[i].d);
y[t][j]=y[t][j+1]=true;
if (f[t][j+1]<f[t][j]+P[i].w)
f[t][j+1]=f[t][j]+P[i].w;
}
}
int i;
for (i=0;i<=n;i++)
{
if (y[n & 1][i]) {printf("%d\n",i);break;}
}
if (i>n) printf("-1\n");
}