排序操作后再恢复
将某一数组排序,再进行操作后,如何按照原顺序输出
先看一例题,该题的思路就是排序排序再排序!

该题的思路引入

以该题为例,首先就是要排序,找到相邻距离,方向相对的蚂蚁。
这里需要用结构体储存位置、方向、编号和永久位置(编号具有大作用,后面会讲)
struct ant{
int w,h,id,p;//p的用途后面会讲
//w为位置,h为方向,id为编号,p为相对位置
}a[N];
按照位置进行排序
bool cmp1(ant a,ant b)
{
return a.w<b.w;
}
sort(a+1,a+n+1,cmp1);
排序之后记录相对位置,相对位置可以理解为蚂蚁们再数轴上的排名
for(int i=1;i<=n;i++) a[i].p=i;
再模拟蚂蚁t时间后的位置
for(int i=1;i<=n;i++) a[i].w+=a[i].h*t;
//a[i].h为1时向右,位置+
//a[i].h为-1时向左,位置-
两个for循环可以写在一块,节约时间
for(int i=1;i<=n;i++)
{
a[i].p=i;
a[i].w+=a[i].h*t;
}
模拟t时间后,还是排序,按照位置进行排序
排序后的蚂蚁的相对位置不会变
原来是第一位的蚂蚁,还是第一位
sort(a+1,a+n+1,cmp1);

t时间后,如果两个蚂蚁正好相撞,根据题意,这是他们的朝向为0;
记得判断
for(int i=1;i<n;i++)
{
if(a[i].w==a[i+1].w)
{
a[i].h=0-a[i].t;
}
}
填充记录从小到大蚂蚁的位置及方向
位置从小到大,又因为相对位置不变,所以只需要按照id排序后,输出该蚂蚁的相对位置对应的数据
for (int i=1;i<=n;i++){
w[i][0]=a[i].w;
w[i][1]=a[i].p;
}
按照输入顺序输出,也就是按照id排序
bool cmp2(ant a,ant b)
{
return a.id<b.id;
}
按照输入时的顺序依次按照各自的永久位置(相对位置)输出每一只蚂蚁的坐标及状态
for (int i=1;i<=n;i++)
cout<<w[a[i].p][0]<<" "<<w[a[i].p][1]<<endl;
完整AC代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10010;
int n,t;
int w[N][2];
struct ant{
int w,h,id,p;//p的用途后面会讲
//w为位置,h为方向,id为编号,p为相对位置
}a[N];
bool cmp1(ant a,ant b)
{
return a.w<b.w;
}
bool cmp2(ant a,ant b)
{
return a.id<b.id;
}
int main()
{
cin>>n>>t;
for(int i=1;i<=n;i++)
{
cin>>a[i].w>>a[i].h;
a[i].id=i;
}
sort(a+1,a+n+1,cmp1);
for(int i=1;i<=n;i++)
{
a[i].p=i;
a[i].w+=a[i].h*t;
}
sort(a+1,a+n+1,cmp1);
for(int i=1;i<n;i++)
{
if(a[i].w==a[i+1].w)
{
a[i].h=a[i+1].h=0;
}
}
for (int i=1;i<=n;i++){ //按位置记录,就是相对位置
w[i][0]=a[i].w;
w[i][1]=a[i].h;
}
sort(a+1,a+n+1,cmp2);
for (int i=1;i<=n;i++)
cout<<w[a[i].p][0]<<' '<<w[a[i].p][1]<<endl;
return 0;
}
结束~~~
若有收获,就点个赞吧~~~

浙公网安备 33010602011771号