排序操作后再恢复

将某一数组排序,再进行操作后,如何按照原顺序输出

 

先看一例题,该题的思路就是排序排序再排序!

 

该题的思路引入

 

 

以该题为例,首先就是要排序,找到相邻距离,方向相对的蚂蚁。

这里需要用结构体储存位置、方向、编号和永久位置(编号具有大作用,后面会讲)

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;
}

 

结束~~~

 

若有收获,就点个赞吧~~~

posted @ 2022-03-14 14:12  XSS9  阅读(73)  评论(0)    收藏  举报