1. 程式人生 > 其它 >排序操作後再恢復

排序操作後再恢復

將某一陣列排序,再進行操作後,如何按照原順序輸出

 

先看一例題,該題的思路就是排序排序再排序!

 

該題的思路引入

 

 

以該題為例,首先就是要排序,找到相鄰距離,方向相對的螞蟻。

這裡需要用結構體儲存位置、方向、編號和永久位置(編號具有大作用,後面會講)

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

 

結束~~~

 

若有收穫,就點個贊吧~~~