A. Treasure Chest
题目大意:人在0处,宝藏在x,钥匙在y,人最多拿宝箱z秒,问你最快多久开宝箱?
思路:如果说钥匙在宝箱的左边,那么人只需要往右走就是最佳答案,如果钥匙在宝箱的右边,那么人只需要拿的宝箱到最佳地点就行
#include<bits/stdc++.h>
using namespace std;
void solve(){
int x,y,k;
cin>>x>>y>>k;
if(y<=x){
cout<<x<<"\n";
}else{
if(x+k>=y){
cout<<y<<"\n";
}else{
cout<<x+k+2*abs(y-x-k)<<"\n";
}
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
B. Points and Minimum Distance
题目大意:给你2*n个数,两两组合,组成一个路径使得相邻点的曼哈顿距离最小
思路:通过贪心思想,肯定是每个相邻点的曼哈顿距离都小才好,所以就先排个序,然后n+1——n下标的数做x轴,1——n的数做y轴一一对应,即使最佳答案。
#include<bits/stdc++.h>
using namespace std;
int a[400];
void solve(){
int n;
cin>>n;
for(int i=1;i<=2*n;i++){
cin>>a[i];
}
sort(a+1,a+1+2*n);
int ans=0;
vector<pair<int,int>>p;
int x=a[2*n];
int y=a[n];
for(int i=2*n;i>=n+1;i--){
ans+=(abs(x-a[i])+abs(y-a[i-n]));
p.push_back({a[i],a[i-n]});
x=a[i];
y=a[i-n];
}
cout<<ans<<"\n";
for(auto c:p){
cout<<c.first<<" "<<c.second<<"\n";
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}