您的位置:首页 > 其它

51nod建设国家

2015-10-12 18:54 260 查看
小C现在想建设一个国家。这个国家中有一个首都,然后有若干个中间站,还有若干个城市。

现在小C想把国家建造成这样的形状:选若干(可以是0个)的中间站把他们连成一条直线,然后把首都连在这一条直线的左端。然后每个点可以连一个城市,特别的是最右端的点可以连接两个城市。

现在有n个城市的规划供小C选择。但是,他们那儿的交通条件比较差,他们那儿一天是2*H个小时,每个城市里面的人每天都会去首都拿一样东西,从他们所在的城市出发,到了首都之后拿了东西就走(拿东西的时间可以忽略不计),他们要在2*H个小时之内返回他们自己的家中(从家中出发到返回家中不超过2*H小时)。

每个城市有两个属性,一个是城市的直径,另外一个是能居住的人口数目。对于第i个城市而言,这两个属性分别是hi,pi。

城市的直径的意思是离这个城市出口最远的人想要出城先要在城里行走的最少的时间。

在首都,中间站,城市之间行走要花费1小时的时间。

小C想选择一些城市然后通过若干的中间站和首都连接起来,在每个人能在2*H小时返回的条件下所有城市居住的总人口数目要最多。

样例解释:最上面的蓝点表示首都,其它的蓝点表示中间站,剩下的红圈表示选择的城市。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define   Max       1010
#define   ll        long long
#define   max(a,b)  a>b?a:b

ll dp[Max][Max];

struct City
{
int hi,pi;
}city[Max];
int  cmp(City x,City y)
{
if(x.hi==y.hi)return x.pi>y.pi;
return  x.hi>y.hi;
}
int main()
{
//    freopen("p1475t14in.txt","r",stdin);
int n,h;
ll ans=0;
scanf("%d%d",&n,&h);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&city[i].hi,&city[i].pi);
}
sort(city+1,city+n+1,cmp);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
dp[i][j]=dp[i-1][j];
if(j+city[i].hi-1<=h&&(j!=1))
ans=max(ans,dp[i-1][j-1]+city[i].pi);
if(j+city[i].hi<=h)
dp[i][j]=max(dp[i][j],city[i].pi+dp[i-1][j-1]);

}
if(n==1)ans=max(ans,dp[1][1]);
printf("%lld\n",ans);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: