Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.68 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define PI 3.14159265359
  4. #define DEGREES 360
  5. #define MINUTES 60
  6. #define SECONDS 60
  7. #define PIZZA_SIZE (DEGREES * MINUTES * SECONDS)
  8.  
  9. int normalize_degree_in_seconds(int degree_in_seconds) {
  10.     if (degree_in_seconds >= PIZZA_SIZE) {
  11.         degree_in_seconds -= PIZZA_SIZE;
  12.     }
  13.     return degree_in_seconds;
  14. }
  15.  
  16. int calc_degree_in_seconds(const int d, const int m, const int s) {
  17.     return s + (SECONDS * m) + (SECONDS * MINUTES * d);
  18. }
  19.  
  20. int next_piece_degree_in_seconds(const char *pizza, int piece_degree_in_seconds) {
  21.  
  22.     int degree_in_seconds;
  23.     for (degree_in_seconds = piece_degree_in_seconds + 1; degree_in_seconds < PIZZA_SIZE && pizza[degree_in_seconds] != 0x1; degree_in_seconds++);
  24.  
  25.     if (pizza[degree_in_seconds] != 0x1) {
  26.         for (degree_in_seconds = 0; pizza[degree_in_seconds] != 0x1; degree_in_seconds++);
  27.     }
  28.  
  29.     return degree_in_seconds;
  30. }
  31.  
  32. double calc_biggest_piece(const char *pizza, const int pizza_radius, const int piece_degree_in_seconds) {
  33.  
  34.     int initial_degree_in_seconds = piece_degree_in_seconds;
  35.     int final_degree_in_seconds = next_piece_degree_in_seconds(pizza, initial_degree_in_seconds);
  36.  
  37.     int biggest_piece_degree_in_seconds = 0;
  38.     do {
  39.  
  40.         int piece_degree_in_seconds = final_degree_in_seconds - initial_degree_in_seconds;
  41.         if (piece_degree_in_seconds <= 0) {
  42.             piece_degree_in_seconds += PIZZA_SIZE;
  43.         }
  44.  
  45.         if (piece_degree_in_seconds > biggest_piece_degree_in_seconds) {
  46.             biggest_piece_degree_in_seconds = piece_degree_in_seconds;
  47.         }
  48.  
  49.         initial_degree_in_seconds = final_degree_in_seconds;
  50.         final_degree_in_seconds = next_piece_degree_in_seconds(pizza, initial_degree_in_seconds);
  51.  
  52.     } while (initial_degree_in_seconds != piece_degree_in_seconds);
  53.  
  54.     return ((double) biggest_piece_degree_in_seconds / 3600) / 360  * pizza_radius * pizza_radius * PI;
  55. }
  56.  
  57. double calc_test_case() {
  58.  
  59.     int r, n, d, m, s;
  60.     char pizza[PIZZA_SIZE] = {0};
  61.  
  62.     scanf("%d %d %d %d %d", &r, &n, &d, &m, &s);
  63.  
  64.     int piece_degree_in_seconds = calc_degree_in_seconds(d, m, s);
  65.     int degree_in_seconds = 0;
  66.  
  67.     while (n--) {
  68.  
  69.         degree_in_seconds += piece_degree_in_seconds;
  70.         degree_in_seconds = normalize_degree_in_seconds(degree_in_seconds);
  71.  
  72.         if (pizza[degree_in_seconds] & 0x1) {
  73.             break;
  74.         }
  75.  
  76.         pizza[degree_in_seconds] = 0x1;
  77.     }
  78.  
  79.     return calc_biggest_piece(pizza, r, piece_degree_in_seconds);
  80. }
  81.  
  82. int main(int argc, char **argv) {
  83.  
  84.     int test_cases;
  85.     scanf("%d", &test_cases);
  86.  
  87.     while(test_cases--) {
  88.         printf("%f\n", calc_test_case());
  89.     }
  90.  
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement