您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页codeforces712#div2 E

codeforces712#div2 E

来源:爱够旅游网


那道这道题毫无思路,看了大佬的博客恍然大物,
题目大意,走遍每一个城市,且每一个城市只走一遍,花费为max(aj-ai,ci)问最小花费。
思路: 虽然题目说从1开始,但是由于是一个环,所以从哪个点开始都无所谓。 研究一下花费,我们发现,如果ci 大,就花费 ci ,如果ci花费小就花费aj-ai,就是说肯定大于ci,可能还没有思路,但是肯定会想到贪心,贪心的话,一个城市有两个属性,那么有没有什么办法让这两个属性绑在一起,(根据答案推过程的思路,hhhh),那我们就把ci全部加起来,那么如果aj-ai 大于ci的话就需要再加上aj-ai-ci的值,但是我们希望这个附加的值尽量小,所以,我们可以只走ai+ci 越来越大的那条路,这样保证aj-ai-ci是越来越小的,所以将ai和ci看成一个整体,至于为什么按照ai排序,因为是用ai减去这个整体,上代码

#include<bits/stdc++.h>
using namespace std;
typedef struct no
{
	  long long a,c;
};

int cmp(no a,no b)
{
	  if(a.a==b.a)  return a.c<b.c;
	  return a.a<b.a;
}
no node[100005]; 
int main()
{
	
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	   cin>>node[i].a>>node[i].c;
	sort(node,node+n,cmp);

	long long ans=0;
	long long maxn=node[0].a+node[0].c;
	for(int i=0;i<n;i++)
	{
		 ans+=node[i].c;
		 if(maxn<node[i].a)   // 如果aj 大于ai+ci 即 aj-ai-ci大于0, 
		 {
		 	  
		 	 ans+= node[i].a-maxn;   // 加上这个附加值 
		 
		 }
		 maxn=max(maxn,node[i].a+node[i].c);
		 
	}
	cout<<ans<<endl;
	return 0;
 } 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务