E - Travel Cards CodeForces - 847K (思维)

题目链接:https://cn.vjudge.net/contest/272855#problem/E

题目大意:给你n,a,b,k,f。n代表有n次旅行计划,然后a代表一次单程旅行的车费,b代表从下车的地方上车再到另一个地点的花费,k代表有特价券k张,f代表这样的特价券的价格,特价券的作用是从a-》b,这条路线上的任意次数任意方向上的花费都是免费的,让你求一个总共车程的最小花费。

具体思路:看了一下别人的思路。首先,给你的路程计划是按照时间顺序来的,对于当前的状态,我们可以先记录一下上一次车程的终点,如果当前的车程的起点和上一次的车程的终点相等,那么这条路径的花费就加上b,否则就加上a。然后讲所有的路径的权值保留下来,然后排序,从最大的开始,如果当前的这条路线的总的花费大于f,那么就在原来不适用特价券的基础上减去省下的钱。

AC代码:

#include<bits/stdc++.h>
#include<string>
#include<cstring>
#include<stdio.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn =100000+100;
# define mod 1000000007
# define ll long long
map<string,int>vis;
map<pair<int,int>,int>q;
bool cmp(int t1,int t2)
{
    return t1>t2;
}
int tt[maxn];
int main()
{
    int n,a,b,k,f;
    cin>>n>>a>>b>>k>>f;
    string t1,t2;
    int num=0;
    int sum=0;
    int t=inf;
    for(int i=1; i<=n; i++)
    {
        cin>>t1>>t2;
        if(vis[t1]==0)
        {
            vis[t1]=++num;
        }
        if(vis[t2]==0)
        {
            vis[t2]=++num;
        }
        if(vis[t1]==t)
            q[make_pair(min(vis[t1],vis[t2]),max(vis[t1],vis[t2]))]+=b,sum+=b;
        else
            q[make_pair(min(vis[t1],vis[t2]),max(vis[t1],vis[t2]))]+=a,sum+=a;
        t=vis[t2];
    }
    int ans=0;
    for(auto i=q.begin(); i!=q.end(); i++)
    {
        tt[++ans]=i->second;
    }
    sort(tt+1,tt+1+ans,cmp);
    for(int i=1; i<=k; i++)
    {
        if(tt[i]<f)break;
        sum-=tt[i]-f;
    }
    cout<<sum<<endl;
    return 0;
}

 

posted @ 2018-12-04 17:02  Let_Life_Stop  阅读(267)  评论(0编辑  收藏  举报