题解 P6317 【[COCI2006-2007#3] TENKICI】
题目描述
在
分析
我们发现每一排,每一列是不影响的,那么可以考虑先按
因为点
所以由小到大一定最优。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5110;
struct node
{
int x,y,id;
}s[N];
struct Q{
int id,M;
char A;
}st[N];
inline int read()
{
int t=0,f = 0;char a=getchar();
while(a<'0'||a>'9'){if(a=='-')f=1;a=getchar();}
while(a>='0'&&a<='9'){t=(t<<1)+(t<<3)+a-'0';a=getchar();}
return f?-t:t;
}
bool cmp1(node a,node b)
{
return a.x<b.x;
}
bool cmp2(node a,node b)
{
return a.y<b.y;
}
long long n,ans = 0,top = 0;
int main()
{
n = read();
for(int i = 1;i <= n;i++)
s[i].x = read(),s[i].y = read(),s[i].id = i;
sort(s+1,s+1+n,cmp1);
for(int i = 1;i <= n;i++)
{
int f = s[i].x - i;
ans += abs(f);
if(f < 0)
{
st[++top].id = s[i].id;
st[top].M = abs(f);
st[top].A = 'D';
}
if(f > 0)
{
st[++top].id = s[i].id;
st[top].M = abs(f);
st[top].A = 'U';
}
}
sort(s+1,s+1+n,cmp2);
for(int i = 1;i <= n;i++)
{
int f = s[i].y - i;
ans += abs(f);
if(f < 0)
{
st[++top].id = s[i].id;
st[top].M = abs(f);
st[top].A = 'R';
}
if(f > 0)
{
st[++top].id = s[i].id;
st[top].M = abs(f);
st[top].A = 'L';
}
}
printf("%lld\n",ans);
for(int i = 1;i <= top;i++)
{
for(int j = 1;j <= st[i].M;j++)
{
printf("%d %c\n",st[i].id,st[i].A);
}
}
}
博客地址