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

来源:互联网 发布:淘宝店铺主页封面 编辑:程序博客网 时间:2024/06/15 20:28



点击打开链接



题意:

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

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

他原本有k金币。 

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

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


题解: 


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

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

          

#include<bits/stdc++.h>#define ll long longusing 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;}


原创粉丝点击