题解: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;
}

浙公网安备 33010602011771号