您的位置:首页 > 其它

cf #422 c Hacker, pack your bags! 【贪心】

2017-07-11 21:36 399 查看
点击打开链接

题意:

一个人要去旅游,然后去旅行社看行程。

有n种走法,每种三个值, l,r,cost.

他原本有k金币。 

           分别代表出发日期,和归来日期,以及花费。

           他想知道他能出行两次的最少花费是多少。不满足输出-1.

题解: 

             因为只要求出行两次,那么枚举中间值就行了,

           枚举每个中间值,然后求出中间值之前的最小值,加中间值之后的最小值既是最优解。

          

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll inf=2e9+10;
ll cost[maxn],day[maxn];
ll dp[maxn];
vector<ll> L[maxn],R[maxn];
int main(){
ll n,k,l,r;
scanf("%lld %lld",&n,&k);
for(int i=1;i<=n;++i){
scanf("%lld %lld %lld",&l,&r,&cost[i]);
day[i]=r-l+1;
L[l].push_back(i);
R[r].push_back(i);
}
for(ll i=1;i<=maxn;++i) dp[i]=inf;
ll ans=inf;
for(ll i=1;i<maxn;++i){
for(ll j=0;j<L[i].size();++j){
ll id=L[i][j];
ll x=k-day[id];
if(x<=0) continue;
ans=min(ans,dp[x]+cost[id]);
}
for(ll j=0;j<R[i].size();++j){
ll id=R[i][j];
ll x=day[id];
dp[x]=min(dp[x],cost[id]);
}
}
printf("%lld\n",(ans==inf)?-1:ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: