P1367 蚂蚁 思路【和清华的一个题目很像】【1】

题目描述 https://www.luogu.org/problemnew/show/P1367

有许多蚂蚁在一根无限长的木棍上,每一只蚂蚁都有一个初始位置和初始朝向(任意两只蚂蚁的初始位置不同)。蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计)。现给出每只蚂蚁的初始位置和初始朝向,请你计算出它们在t秒后的位置和朝向。

输入输出格式

输入格式:

第一行,两个空格隔开的整数n,t(代表蚂蚁数n和时间t)

第2~n+1行每行两个整数,第i+1行代表第i只蚂蚁的初始位置ai(ai的绝对值在1000000以内)及初始朝向bi(bi=1时蚂蚁朝右,bi=-1时蚂蚁朝左)

输出格式:

n行,每行两个整数,第i行代表t秒后第i只蚂蚁的位置及朝向(-1表示朝左,1表示朝右,0表示正在转向中)

输入输出样例

输入样例#1: 复制

4 1
1 1
5 1
3 -1 
10 1

输出样例#1: 复制

2 0
6 1
2 0
11 1

说明

【数据范围】

对于40%的数据,n<=100

对于80%的数据,n<=10000,t<=1000

对于100%的数据,n<=100000,t<=100000

思路:第一步 考虑的蚂蚁的“穿过”思路,类似于独木桥,另外考虑到蚂蚁的相对 位置是不变的, 所有蚂蚁的最终位置可以确定

         第二步 确定蚂蚁的方向,蚂蚁的方向应该是这个蚂蚁想兑换的那个蚂蚁的方向。

        最后,按照输入的顺序处理。这个花了好久才对应起来。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>
#define N 100008
using namespace std;
typedef struct {
	int intv;
	int seq;
} Node1;
typedef struct {
	int v;
	int dir;
} Node2;
Node1 Seq[N];
Node2 Val[N];
bool mycmp1(Node2 a,Node2 b) {
	return a.v<=b.v;
}

bool mycmp2(Node1 a,Node1 b) {
	return a.intv<=b.intv;
}

bool mycmp3(Node1 a,Node1 b) {
	return a.seq<=b.seq;
}
int main() {
	int n,t;
	cin>>n>>t;
	int tempv,tempd;
	for(int i=1; i<=n; i++) {
		cin>>tempv>>tempd;
		Seq[i].intv=tempv;
		Seq[i].seq=i;
		Val[i].v=tempv;
		Val[i].dir=tempd;
	}

	for(int i=1; i<=n; i++) {
		if(Val[i].dir>0)
			Val[i].v+=t;
		else Val[i].v-=t;
	}
	sort(Val+1,Val+n+1,mycmp1);
	sort(Seq+1,Seq+n+1,mycmp2);
	for(int i=1; i<=n; i++) {
		Seq[i].intv=i;
	}
	sort(Seq+1,Seq+n+1,mycmp3);

	for(int i=1; i<n; i++) {
		if(Val[i].v==Val[i+1].v) {
			Val[i].dir=0;
			Val[i+1].dir=0;
		}
	}
	for(int i=1; i<=n; i++) {
		cout<<Val[Seq[i].intv].v<<" "<<Val[Seq[i].intv].dir<<endl;
	}


}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值