Форум программистов, компьютерный форум CyberForum.ru

Керлинг С++ - C++

Восстановить пароль Регистрация
 
nazerke
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 24
04.03.2014, 14:33     Керлинг С++ #1
Задача А. Кёрлинг
Ограничения по времени: 2 секунды
Ограничения по памяти: 64 мегабайт
Входной файл: A.in
Выходной файл: A.out

Далер, Баян, Рустембек и Нурлыбек с напряжением следили за Олимпиадой в Сочи. Обнаружив, что на Олимпиаде у Казахстана не было команды по кёрлингу, они решили исправить эту досадную несправедливость. Они создали новую команду, и даже провели свою первую тренировку. Тренировка шла успешно, пока не выяснилось, что никто из ребят не знает, как считать результат игры. Далер решил попросить помощи у Биржана – эксперта в правилах абсолютно всех видов спорта (даже самых странных). К сожалению, Биржан был занят на тренировке по бобслею, но смог по телефону объяснить нашим начинающим кёрлингистам как считать очки. Итак, внимание:

В кёрлинг играют две команды: одна “метает” красные камни, другая – жёлтые. На площадке для кёрлинга есть специальное место, которое называется “дом”. Дом – это окружность с центром в точке P(x, y) и с радиусом R. Цель команд – закинуть свои камни как можно ближе к центру дома. В расчёт берутся только камни, находящиеся в доме и расстояние от которых до центра дома меньше, чем расстояние любого камня соперника до центра дома. Если дом пуст, или же расстояния ближайших камней соперников от центра дома будут равны, тогда исход игры – ничья. Надеюсь, примеры помогут вам разобраться в правилах этой игры.

Входные данные
Первая строка входных данных содержит целое число N (1<=N<=100) – количество камней у каждой команды. Следующие N строк содержат по два целых числа - координаты красных камней. Следующие N строк содержат по два целых числа – координаты жёлтых камней. Все координаты по модулю не превышают 1000. В последней строке входного файла даются 3 целых числа: x, y и R (-1000<=x,y<=1000), (1<=R<=1000) – координаты центра дома и его радиус.

Выходные данные
Выведите исход игры в данном формате:
1) Если игра завершилась в ничью, выведите “Draw”.
2) Если игра завершилась победой красной команды, выведите “Red team wins k stones”, где k – количество камней красной команды, попавших в расчёт.
3) Если игра завершилась в пользу жёлтой команды, выведите “Yellow team wins k stones”, где k – количество камней жёлтой команды, попавших в расчёт.
4) Если k оканчивается на 1, выведите слово stones в единственном числе (правила английского языка тоже нужно соблюдать).

Примеры:

2
1 0
2 -3
-2 0
-1 -2
0 0 4 Red team wins 1 stone
2
6 0
6 1
-2 4
-1 3
0 0 4 Yellow team wins 1 stone
2
2 0
0 -2
-2 0
0 2
0 0 4
Draw
2
2 0
0 -2
-2 0
0 2
0 0 1
Draw
Срочно!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Amandosov
Знаток
156 / 156 / 65
Регистрация: 18.11.2012
Сообщений: 411
Записей в блоге: 2
04.03.2014, 15:12     Керлинг С++ #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include<math.h>
 
using namespace std;
 
int main()
{
  int n;
  double x1[101],x2[101],y1[101],y2[101],x,y,r;
  cin>>n;
  for(int i=0;i<n;i++)
  cin>>x1[i]>>y1[i];
  for(int i=0;i<n;i++)
  cin>>x2[i]>>y2[i];
  
  cin>>x>>y>>r;
  
  double minx1=x1[0],miny1=y1[0];
  double minx2=x2[0],miny2=y2[0];
  
  for(int i=0;i<n;i++)
  if(((x-x1[i])*(x-x1[i])+(y-y1[i])*(y-y1[i]))<((x-minx1)*(x-minx1)+(y-miny1)*(y-miny1)))
  {
    minx1=x1[i];
    miny1=y1[i];
  }
  
  for(int i=0;i<n;i++)
  if(((x-x2[i])*(x-x2[i])+(y-y2[i])*(y-y2[i]))<((x-minx2)*(x-minx2)+(y-miny2)*(y-miny2)))
  {
    minx2=x2[i];
    miny2=y2[i];
  }
  
  double mind1,mind2;
  mind1=sqrt((x-minx1)*(x-minx1)+(y-miny1)*(y-miny1));
  mind2=sqrt((x-minx2)*(x-minx2)+(y-miny2)*(y-miny2));
  
  if(mind1>r&&mind2>r||mind1==mind2) {cout<<"Draw"; return 0;}
  
  if(mind1<mind2) 
  {
      int k=0;
      for(int i=0;i<n;i++)
      {double d=sqrt((x-x1[i])*(x-x1[i])+(y-y1[i])*(y-y1[i]));
      if(d<mind2&&d<=r) k++;
      }
      
      if(k==1) cout<<"Red team wins 1 stone";
      else cout<<"Red team wins "<<k<<" stones";
      return 0;
  }
    int k=0;
    for(int i=0;i<n;i++)
    {double d=sqrt((x-x2[i])*(x-x2[i])+(y-y2[i])*(y-y2[i]));
    if(d<mind1&&d<=r) k++;
    }
     
    if(k==1) cout<<"Yellow team wins 1 stone";
    else cout<<"Yellow team wins "<<k<<" stones";
    return 0;
  
}
Yandex
Объявления
04.03.2014, 15:12     Керлинг С++
Ответ Создать тему
Опции темы

Текущее время: 18:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru