Advertisement
dmkozyrev

298.cpp

Jun 2nd, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <cstdlib>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. int count_unique(vector<double> & v, bool sort_flag = true) {
  10. //  подсчет количества уникальных элементов в векторе v
  11. //  v - исходный вектор из вещественных чисел
  12. //  sort_flag - требуется ли сортировка вектора
  13. //  false - нет, вектор уже отсортирован
  14. //  true - да, вектор еще не отсортирован (по умолчанию)
  15.  
  16.     if (sort_flag) // если требуется сортировка
  17.         sort(v.begin(), v.end()); // Сортируем вектор по возрастанию
  18.    
  19.     //  Подсчет количества уникальных элементов
  20.     int count = 1; // Изначально один уникальный элемент
  21.     for (int i = 1; i < (int) v.size(); ++i)
  22.         count += (v[i-1] < v[i]); // Увеличиваем счетчик, если элемент слева меньше элемента справа
  23.            
  24.     return count;   // возвращаем значение счетчика
  25. }
  26.  
  27. void random_vector(int n, vector<double> & v, bool assign_flag = true) {
  28. //  генератор n случайных точек
  29. //  n - количество точек
  30. //  v - вектор, куда будут точки записаны
  31. //  assign_flag - флаг, отвечающий за то, нужно ли выделить под n точек место
  32. //  true - да, под вектор еще не выделено место (по умолчанию)
  33. //  false - нет, в вектор влезет указанное количество точек
  34.  
  35.     if (assign_flag) // Если нужно выделить место под вектор
  36.         v.assign(n, 0); // Выделяем n ячеек, заполняя нулями
  37.    
  38.     for (int i = 0; i < n; ++i) // Заполняем арктангенсами от случайных чисел из диапазона [-10000..10000]
  39.         v[i] = atan2(rand() % 20001-10000, rand() % 20001-10000);  
  40. }
  41.  
  42. void researching(int n) {
  43. //  Исследование времени работы программы от n точек
  44.  
  45.     vector<double> v; // объявляем вектор из вещественных чисел
  46.     random_vector(n, v); // заполняем случайными точками
  47.     count_unique(v); // считаем уникальные арктангенсы
  48. }
  49.  
  50. int main() {
  51.     freopen("input.txt", "rt", stdin); // файл на чтение
  52.     freopen("output.txt", "wt", stdout); // файл на вывод
  53.    
  54.     researching(1750000); // запускаем исследование 1.750.000 точек
  55.    
  56. //  Далее рещаем задачу
  57.     int n; // количество точек
  58.     scanf("%d", &n); // считываем количество точек из файла
  59.    
  60.     vector<double> v(n); // выделяем память под вектор из n элементов
  61.    
  62.     for (int i = 0, x, y; i < n; ++i) { // в цикле по всем точкам
  63.         scanf("%d %d", &x, &y); //  считываем текущую точку
  64.         v[i] = atan2(x, y);     //  записываем арктангенс от нее
  65.     }
  66.    
  67.     printf("%d", count_unique(v)); // Выводим количество уникальных арктангенсов
  68.    
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement