All pastes #2092602 Raw Edit

Anonymous

public text v1 · immutable
#2092602 ·published 2011-10-22 18:15 UTC
rendered paste body
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <climits>
#include <cmath>

using namespace std;

struct Balle {
	float vitesse;
	float position;
	int numero;
	bool collided;
};

struct Scenario {
	std::vector<Balle> balles;
	
	int trackedBall_i;	
	int temps;	
};

struct Collision {
	Collision(int &a, int &b): b1(a), b2(b) {}

	int b1, b2;
};

bool sortByPosition (Balle i, Balle j) { return (i.position<j.position); }

struct CollisionRange
{
	int startIndex;
	vector<int> indexRange;
};

float detectCollision(Balle b1, Balle b2)
{
	if(b1.vitesse == b2.vitesse)
		return -1;

	if(b1.position == 0 || b2.position == b2.vitesse)
		return -1;

	if(b1.position > b2.position && b1.vitesse > 0 && b2.vitesse < 0)
		return -1;

	if(b1.position < b2.position && b1.vitesse < 0 && b2.vitesse > 0)
		return -1;

	return (float)((b2.position - b1.position) / (b1.vitesse - b2.vitesse));
}

void swap(Balle& b1, Balle& b2)
{
	float temp = b1.position;
	b1.position = b2.position;
	b2.position = temp;

	temp = b1.vitesse;
	b1.vitesse = b2.vitesse;
	b2.vitesse = temp;
}

void fastForward(Scenario& s, float time)
{
	for(int i = 0; i < (int)s.balles.size(); ++i)
	{
		s.balles[i].position += s.balles[i].vitesse * time;
		if(s.balles[i].position >= 100)
		{
			s.balles[i].position = 100;
			s.balles[i].vitesse = 0;
		}

		if(s.balles[i].position <= 0)
		{
			s.balles[i].position = 0;
			s.balles[i].vitesse = 0;
		}
	}
}

void solve(Scenario& s) {

	sort(s.balles.begin(), s.balles.end(), sortByPosition);
	float timeLeft = s.temps;

	while(timeLeft > 0)
	{
		vector<int> collisions;
		
		float timeTillCollision = 100000000;
		for(int i = 0; i < (int)s.balles.size()-1; ++i)
		{
			float tempTime = detectCollision(s.balles[i], s.balles[i+1]);
			if(tempTime > 0 && tempTime < timeTillCollision)
			{
				timeTillCollision = tempTime;
				collisions.clear();
			}
			if(fabs(tempTime - timeTillCollision) < 0.00000000001)
			{
				collisions.push_back(i);
			}			
		}

		if(timeTillCollision > timeLeft)
		{
			timeTillCollision = timeLeft;
			collisions.clear();
		}

		if(collisions.size() > 0 )
		{
			fastForward(s, (timeTillCollision));

			for(int i = 0; i < (int)collisions.size(); ++i)
				swap(s.balles[collisions[i]], s.balles[collisions[i]+1]);

			timeLeft -= timeTillCollision;
			collisions.clear();
		}
		else
		{
			fastForward(s, timeLeft);
			timeLeft = 0;
		}


	}
	
	for(int i = 0; i < (int)s.balles.size(); ++i)
	{
		if(s.balles[i].numero == s.trackedBall_i)
		{
			cout << (int)floor(s.balles[i].position+0.5); 
		}
	}
}

int main() {
	int n;
	
	cin >> n;
	
	for (int i = 0; i < n; i++) {
		Scenario scenario;
		int nbBalles;
		
		cin >> nbBalles;
		
		for (int j = 0; j < nbBalles; j++) {
			Balle balle;
			
			cin >> balle.position >> balle.vitesse;
			balle.numero = j + 1;
			if(balle.position >= 100)
			{
				balle.vitesse = 0;
				balle.position = 100;
			}
			if(balle.position <= 0)
			{
				balle.vitesse = 0;
				balle.position = 0;
			}
			scenario.balles.push_back(balle);			
		}
		
		cin >> scenario.trackedBall_i >> scenario.temps;
		solve(scenario);
		cout << endl;
	}
	
	return 0;
}