Educational Codeforces Round 157 (Rated for Div. 2)

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;
} 
posted @ 2023-11-06 12:01  yufan1102  阅读(23)  评论(0编辑  收藏  举报