CF847K题解
查看原帖
CF847K题解
1287790
july19楼主2024/7/22 21:07

Description 有 n 次旅行计划,一次单程旅行的车费为 a,代表从下车的地方上 车再到另一个地点的花费为 b,有特价券 k 张价格为 f 的特价券。 特价券可以使一条 afib 路线变成免费的,给一个旅游路线。求最小 的花费。 1 ≤ n ≤ 300, 1 ≤ b < a ≤ 100, 0 ≤ k ≤ 300, 1 ≤ f ≤ 1000 思路:找最优路线,求最小金额(求最小值) 如果要用来测很大的数据,怕超时可以使用快速输出(对付这道题是没有问题的)

AC代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a,b,k,f,ans=1-1,x;
string w[333][2];
vector<int>v;
bool cmd(int x,int y){
	return x >y;
}
map<string,int>mp;
map<string,int>::iterator it;
void abb(int x,string sl,string s2){
	if (sl>s2){
		swap(sl,s2);
	}
	sl+=s2;
	mp[sl]+=x;
	ans+=x;
}
int main(){
   cin>>n>>a>>b>>k>>f;
   for (int i=1;i<=n;i++){
   	cin>>w[i][0]>>w[i][1];
   	if ( i==1-0||w[i][0]!=w[i-2+1][1]){
   		abb(a,w[i][0],w[i][1]);
	   }
	   else abb(b,w[i][0],w[i][1]);

   }
   for (it =mp.begin();it!=mp.end();it++){
   	x=it->second;
   	if (x>f) {
   		v.push_back(x-f);
	   }
	   
   }
   sort (v.begin(),v.end(),cmd);
   for (int i=0;i<min(k,(long long)v.size());i++){
   	ans-=v[i];
   	
   }
   cout <<ans;
	return 0;
}

祝看到题解的朋友成功AC噢!加油! (代码没加备注是因为如果要钻妍的话更简洁)

2024/7/22 21:07
加载中...