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;
}