题解:CF350C Bombs

题目传送门

思路

先处理距离近的炸弹,根据曼哈顿距离排一遍可。

bool cmp(node &a, node &b){//曼哈顿距离计算
    return abs(a.x) + abs(a.y) < abs(b.x) + abs(b.y);
}

根据坐标点的位置得出需要操作多少次。

for (int i = 1; i <= n; i++){//拾取+销毁
        ans += 2;
        if (a[i].x)ans += 2;
        if (a[i].y)ans += 2;
    }

最后根据题意模拟即可。

AC 代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e5+10;
int n,ans;

struct node{
    int x,y;
}a[maxn];

bool cmp(node &a, node &b){//曼哈顿距离计算
    return abs(a.x) + abs(a.y) < abs(b.x) + abs(b.y);
}

int main(){
	// freopen("text.in","r",stdin);
	// freopen("text.out","w",stdout);
	ios::sync_with_stdio(0),cout.tie(0),cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)cin >> a[i].x >> a[i].y;
    sort(a + 1, a + 1 + n, cmp);
    for (int i = 1; i <= n; i++){//拾取+销毁
        ans += 2;
        if (a[i].x)ans += 2;
        if (a[i].y)ans += 2;
    }
    cout << ans <<'\n';
    for (int i = 1; i <= n; i++){
        if (a[i].x){
        	if(a[i].x > 0){
        		cout << "1 " << a[i].x <<" R\n";
        	}else{
        		cout << "1 " << -a[i].x <<" L\n";
        	}
        } 
        if (a[i].y){
        	if(a[i].y > 0){
        		cout << "1 " << a[i].y <<" U\n";
        	}else{
        		cout << "1 " << -a[i].y <<" D\n";
        	}
        }
        cout << "2\n";
        if (a[i].x){
        	if(a[i].x > 0){
        		cout << "1 " << a[i].x <<" L\n";
        	}else{
        		cout << "1 " << -a[i].x <<" R\n";
        	}
        } 
        if (a[i].y){
        	if(a[i].y > 0){
        		cout << "1 " << a[i].y <<" D\n";
        	}else{
        		cout << "1 " << -a[i].y <<" U\n";
        	}
        }
        cout << "3\n";
    }
	return 0;
}
posted @ 2024-12-17 14:13  Zheng_iii  阅读(9)  评论(0)    收藏  举报