将某一数组排序,再进行操作后,如何按照原顺序输出
先看一例题,该题的思路就是排序排序再排序!
该题的思路引入
以该题为例,首先就是要排序,找到相邻距离,方向相对的蚂蚁。
这里需要用结构体储存位置、方向、编号和永久位置(编号具有大作用,后面会讲)
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=a[i+1].h=0;}}
填充记录从小到大蚂蚁的位置及方向
for (int i=1;i<=n;i++){w[i][0]=ant[i].w;w[i][1]=ant[i].f;}
按照输入顺序输出,也就是按照id排序
bool cmp2(ant a,ant b){return a.id<b.id;}
按照输入时的顺序依次按照各自的永久位置输出每一只蚂蚁的坐标及状态
for (int i=1;i<=n;i++)cout<<w[ant[i].d][0]<<w[ant[i].d][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;}
