【codeforces 350C】Bombs
阿新 • • 發佈:2018-10-04
題解 ref urn put main 遇到 一個 出現 -a
【鏈接】 我是鏈接,點我呀:)
【題意】
【題解】
會發現在x軸以及y軸上的炸彈,能用較少的操作數除掉。
而其他的點,會發現操作數都是一樣的。
那麽先把x,y軸上的點都除掉。
其他點。
我們優先沿著橫坐標軸移動到和它相同位置。
然後再改變y坐標和目標炸彈一致。
然後就會發現。
x相同的話,要以y坐標的絕對值升序排,要優先處理y的絕對值小的點。
不然可能會出現走的過程中遇到另外一個炸彈的情況。
sort一波+貪心就好。
【代碼】
#include <bits/stdc++.h> #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) using namespace std; const int N = 1e5; struct abc{ int x,y; }; int n,cnt; abc a[N+10]; bool cmp1(abc a,abc b){ return a.y<b.y; } bool cmp2(abc a,abc b){ return a.x<b.x; } bool cmp3(abc a,abc b){ if (a.x!=b.x) return a.x<b.x; else { if (a.y<0 && b.y<0){ return a.y>b.y; }else return a.y<b.y; } } int main() { scanf("%d",&n); rep1(i,1,n){ scanf("%d%d",&a[i].x,&a[i].y); if (a[i].x==0 || a[i].y==0) cnt++; } printf("%d\n",cnt*4+(n-cnt)*6); //從下到上排序. sort(a+1,a+1+n,cmp1); rep1(i,1,n) if (a[i].x==0){ if (a[i].y>0){ printf("1 %d U\n",a[i].y); puts("2"); printf("1 %d D\n",a[i].y); puts("3"); } } rep2(i,n,1) if (a[i].x==0){ if (a[i].y<0){ printf("1 %d D\n",-a[i].y); puts("2"); printf("1 %d U\n",-a[i].y); puts("3"); } } //從左往右排序 sort(a+1,a+1+n,cmp2); rep1(i,1,n) if (a[i].y==0){ if (a[i].x>0){ printf("1 %d R\n",a[i].x); puts("2"); printf("1 %d L\n",a[i].x); puts("3"); } } rep2(i,n,1) if (a[i].y==0){ if (a[i].x<0){ printf("1 %d L\n",-a[i].x); puts("2"); printf("1 %d R\n",-a[i].x); puts("3"); } } sort(a+1,a+1+n,cmp3); rep1(i,1,n) if (a[i].x!=0 && a[i].y!=0){ printf("1 %d ",abs(a[i].x));if (a[i].x<0) puts("L");else puts("R"); printf("1 %d ",abs(a[i].y));if (a[i].y<0) puts("D");else puts("U"); puts("2"); printf("1 %d ",abs(a[i].y));if (a[i].y<0) puts("U");else puts("D"); printf("1 %d ",abs(a[i].x));if (a[i].x<0) puts("R");else puts("L"); puts("3"); } return 0; }
【codeforces 350C】Bombs