HDU1025——Constructing Roads In JGShining's Kingdom

题目中穷国和富国在两条平行线上,而且修得路不能交叉,每个富国有且仅有某一个穷国所需要的资源。

由此可将其转化为求在两平行线间最多可画多少条不交叉的直线问题,所以直接对某条线上的点求LIS,当n = 0时输出0条路。

根据LIS模板AC的代码:

View Code
#include <stdio.h>
#include <string.h>
#define N 500001

int i, n;
int a[N], d[N];

int binsearch(int x, int len)
{
int l = 1, r = len, mid;
while(l <= r)
{
mid = (l+r) >> 1;
if(d[mid-1] <= x && x < d[mid])
{
return mid;
}
else if(x > d[mid])
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
return 0;
}
int main()
{
int i, j, k, len;
int p, r;
k = 1;
while(scanf("%d", &n) != EOF)
{
printf("Case %d:\n", k ++);
if(!n)
{
printf("My king, at most 0 road can be built.\n\n");
continue;
}
for(i=1;i<=n;i++)
{
scanf("%d%d", &p, &r);
a[r] = p;
}
memset ( d, 0, sizeof(d) );
d[1] = a[1];
len = 1;
for(i=2;i<=n;i++)
{
if(a[i] < d[1])
{
j = 1;
}
else if(a[i] > d[len])
{
j = ++len;
}
else
{
j = binsearch(a[i], len);
}
d[j] = a[i];
}
if(len-1)
{
printf("My king, at most %d roads can be built.\n\n", len);
}
else
{
printf("My king, at most %d road can be built.\n\n", len);
}
}
return 0;
}

 

 

 

 

View Code
#include <stdio.h>
#define MaxN 500001

int road[MaxN],dp[MaxN];

int main()
{
int n ,i, hight, low, mid, len, k=1;
while(scanf("%d",&n) != EOF)
{
if(!n)
{
printf("Case %d:\nMy king, at most 0 road can be built.\n\n", k ++);
continue;
}
for(i=0; i<n; i++)
{
scanf("%d%d", &hight, &low);
road[hight] = low;
}
dp[1]=road[1];
len=1;
for(i=2; i<=n; i++)
{
low=0;
hight=len;
while(low<=hight)
{
mid=(low+hight)/2;
if(road[i]>dp[mid])
{
low=mid+1;
}
else
{
hight=mid-1;
}
}
dp[low]=road[i];
if(low>len)
{
len++;
}
}
if(len>1)
{
printf("Case %d:\nMy king, at most %d roads can be built.\n\n", k ++, len);
}
else
{
printf("Case %d:\nMy king, at most %d road can be built.\n\n", k ++, len);
}
}
return 0;
}

 

posted @ 2011-12-01 19:05  1050768624  阅读(157)  评论(0编辑  收藏  举报