CF-Minimize Distance
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; vector<int>a,b; for(int i=0;i<n;i++) { int x; cin>>x; if(x>0)a.push_back(x); else b.push_back(-x); } sort(a.begin(),a.end()); sort(b.begin(),b.end()); long long ans=0; for(int i=a.size()-1;i>=0;) { ans+=a[i]; if(i-m>=0)i-=m; else break; } for(int i=b.size()-1;i>=0;) { ans+=b[i]; if(i-m>=0)i-=m; else break; } cout<<ans<<endl; } }
这题考察的是贪心算法,想要走的路程最短,则需要返回的路程最短。所以不能到达最远的那个点在折返回来。
即最远的那个点我们就去一次,其他的点是每个都要去的,要求的返回路程最短,可以反着考虑,到达最远点
后,可以顺带给max到max-m+1点的货也给送了,这样我们送到max-m的点就可以回去拿货了。