那道这道题毫无思路,看了大佬的博客恍然大物,
题目大意,走遍每一个城市,且每一个城市只走一遍,花费为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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务