Ranking (as of 2013-08-10): 154 out of 839
Language: C++
/*
UVa 914 - Jumping Champion
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_914_Jumping_Champion.cpp
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cmath>
using namespace std;
const int n_max = 1000000;
bool not_primes[n_max + 1]; // not_primes[i] is true if i is not a prime
void sieve_of_eratosthenes()
{
for (int i = 2, e = static_cast<int>(sqrt(static_cast<double>(n_max)));
i <= e; i++)
if (!not_primes[i]) {
for (int j = i * i; j <= n_max; j += i)
not_primes[j] = true;
}
}
int main()
{
sieve_of_eratosthenes();
int nr_primes = 0, nr_diffs = 0;
for (int i = 2, pi = 0; i <= n_max; i++)
if (!not_primes[i]) {
if (nr_primes)
nr_diffs = max(nr_diffs, i - pi);
nr_primes++;
pi = i;
}
#ifdef DEBUG
cout << nr_primes << ' ' << nr_diffs << endl;
#endif
vector<int> primes(nr_primes);
for (int i = 2, pi = 0; i <= n_max; i++)
if (!not_primes[i])
primes[pi++] = i;
int t;
cin >> t;
while (t--) {
int l, u;
cin >> l >> u;
bool no_jumping_champion = false;
int diff = 0;
if (u < primes[0] || l > primes[nr_primes - 1])
no_jumping_champion = true; // no primes between l and u
else {
if (u > primes[nr_primes - 1])
u = primes[nr_primes - 1];
int li = distance(primes.begin(),
lower_bound(primes.begin(), primes.end(), l)),
ui = distance(primes.begin(),
lower_bound(primes.begin(), primes.end(), u));
if (primes[ui] != u)
ui--;
if (ui - li > 0) {
vector<int> diffs(nr_diffs + 1, 0);
// diffs[i] is the number of occurrences of difference i
for (int i = li + 1; i <= ui; i++)
diffs[primes[i] - primes[i - 1]]++;
int max_occurences = 0;
for (int i = 1; i <= nr_diffs; i++)
max_occurences = max(max_occurences, diffs[i]);
int nr_max_occurences = 0;
for (int i = 1; i <= nr_diffs; i++)
if (diffs[i] == max_occurences) {
diff = i;
if (++nr_max_occurences > 1)
break;
}
if (nr_max_occurences > 1)
no_jumping_champion = true;
}
else
no_jumping_champion = true;
}
if (no_jumping_champion)
cout << "No jumping champion\n";
else
cout << "The jumping champion is " << diff << endl;
}
return 0;
}
No comments:
Post a Comment