Codeforces-1463C. Robô ocupado (pensando)

Robô Ocupado

Título

O robô inicialmente aceita comandos na origem em um eixo digital em um determinado momento e avança na direção do comando. Ele avança 1 distância por segundo. Ignora outros comandos no momento atual quando não atinge o final do comando atual . Se o robô estiver em [ti, ti + 1] [t_i, t_ {i + 1}][ tEu,ti + 1] Mova-se paraxi x_identro do tempoxEu A posição é considerada a conclusão de um comando (comandos ignorados podem ser executados com sucesso)

Dê uma série de instruções e pergunte quantas vezes o robô pode completar

Ideias

Grave o ponto de cada instrução começando st sts t e ponto finaled ede d a próximarede detempo de paradan e t A última vez que um comando executável foi recebidoultimamentel para s

Percorra cada instrução se o tempo de instrução atual for maior ou igual à reden e t indica que o comando atual pode ser executado para atualizarnet, st, ed, las net, st, ed, lasn e t s t e d l a s

Caso contrário, julgue se o robô pode estar em [ti, ti + 1] [t_i, t_ {i + 1}][ tEu,ti + 1] Mova-se paraxi x_identro do tempoxEuA localização é baseada em tit _itEuTempo para ti + 1 t_ {i + 1}ti + 1O robô passa xi x_i no momentoxEu

Código

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
using namespace std;

inline int gcd(int a, int b) {
    
     return b ? gcd(b, a % b) : a; }
typedef long long LL;
typedef pair<int, int>PII;
const int N = 100100;

int n;
LL tim[N];
LL pos[N];

void solve() {
    
    
	cin >> n;
	for (int i = 0; i < n; ++i) {
    
    
		cin >> tim[i] >> pos[i];
	}
	tim[n] = 1e10;

	LL net = 0; //下一次停止的时间
	LL st = 0, ed = 0; //一次指令的起点和终点
	LL las = 0; //上一次接收到命令的时间
	LL res = 0;

	for (int i = 0; i < n; ++i) {
    
    
		if (tim[i] >= net) {
    
    
			net = tim[i] + abs(pos[i] - ed);
			st = ed, ed = pos[i];
			las = i;
			if (net <= tim[i + 1])
				res++;
		}
		else {
    
    
			if (st >= ed) {
    
    
				int y = st - (tim[i] - tim[las]);
				int x = max(ed, st - (tim[i + 1] - tim[las]));
				if (pos[i] >= x && pos[i] <= y)res++;
			}
			else {
    
    
				int x = st + (tim[i] - tim[las]);
				int y = min(ed, st + tim[i + 1] - tim[las]);
				if (pos[i] >= x && pos[i] <= y)res++;
			}
		}
	}
	cout << res << endl;
}
int main() {
    
    
	int t; cin >> t;
	while (t--)
		solve();

	return 0;
}

Acho que você gosta

Origin blog.csdn.net/zzq0523/article/details/109251653
Recomendado
Clasificación