排序操作後再恢復
阿新 • • 發佈:2022-03-14
將某一陣列排序,再進行操作後,如何按照原順序輸出
先看一例題,該題的思路就是排序排序再排序!
該題的思路引入
以該題為例,首先就是要排序,找到相鄰距離,方向相對的螞蟻。
這裡需要用結構體儲存位置、方向、編號和永久位置(編號具有大作用,後面會講)
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;
}
結束~~~
若有收穫,就點個贊吧~~~