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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Temirlan90
132 / 132 / 8
Регистрация: 30.09.2010
Сообщений: 333
#1

Определить количество пораженных мишеней - C++

12.05.2011, 17:48. Просмотров 1693. Ответов 22
Метки нет (Все метки)

Кликните здесь для просмотра всего текста
Биатлон
(Время: 1 сек. Память: 16 Мб Сложность: 24%)

На Зимних Олимпийских Играх традиционно проводятся соревнования по биатлону. Как известно, этот вид спорта содержит лыжные гонки и стрельбу по мишеням из винтовки. На каждом огневом рубеже расположены 5 мишеней. Каждая из них имеет форму круга радиусом 10 см, а расстояния между центрами соседних мишеней одинаковы и равны 25 см. Центры мишеней при этом расположены на одной горизонтали.

Введем прямоугольную систему координат так, что начало координат расположено в центре самой левой мишени, ось Ox направлена вправо, а ось Oy - вверх. Таким образом, центры мишеней имеют координаты (0, 0), (25, 0), (50, 0), (75, 0) и (100, 0).

Для информационного обеспечения проведения соревнований было решено разработать систему подсчета количества пораженных мишеней. Эта система по точкам, в которые попали пули после выстрелов спортсмена, должна определять количество пораженных мишеней. Мишень считается пораженной, если в нее попала хотя бы одна пуля (при этом, разумеется, если в мишень попали две или больше пуль, то попадание считается только один раз).

На спринтерской гонке на каждом огневом рубеже у спортсмена есть 5 пуль. Вам даны координаты точек, в которые попали пули после выстрелов спортсмена. Определите количество пораженных мишеней.
Входные данные

Входной файл INPUT.TXT содержит ровно пять строк: i-ая из них содержит два целых числа xi и yi - координаты точки, в которую попала пуля после i-ого выстрела спортсмена. Все числа во входном файле не превосходят 1000 по модулю.
Выходные данные

В выходной файл OUTPUT.TXT выведите единственное число – число пораженных мишеней.
INPUT.TXT
0 0
25 0
50 0
75 0
100 0
OUTPUT.TXT
5

INPUT.TXT
0 0
0 0
0 0
75 0
100 0
OUTPUT.TXT
3

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
#include <iostream>
using namespace std;
int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int x, y, count = 0, t1, t2, t3, t4, t5;
    t1 = t2 = t3 = t4 = t5 = 0;
    for(int i = 0; i < 5; ++i) {
        cin >> x >> y;
        if(abs(x) + abs(y) >= 0 && abs(x) + abs(y) <= 10 && t1 != 1) {
            t1 = 1;
            ++count;
        }
        else if(abs(x) + abs(y) >= 15 && abs(x) + abs(y) <= 35 && t2 != 1) {
            t2 = 1;
            ++count;
        }
        else if(abs(x) + abs(y) >= 40 && abs(x) + abs(y) <= 60 && t3 != 1) {
            t3 = 1;
            ++count;
        }
        else if(abs(x) + abs(y) >= 65 && abs(x) + abs(y) <= 85 && t4 != 1) {
            t4 = 1;
            ++count;
        }
        else if(abs(x) + abs(y) >= 90 && abs(x) + abs(y) <= 110 && t5 != 1) {
            t5 = 1;
            ++count;
        }
    }
    cout << count;  
    return 0;
}
7-й тест проваливает..., дайте контр-пример.

Добавлено через 1 час 42 минуты
контр-пример
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2011, 17:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить количество пораженных мишеней (C++):

Биатлон (найти количество пораженных мишеней) - C++
На Зимних Олимпийских Играх традиционно проводятся соревнования по биатлону. Как известно, этот вид спорта содержит лыжные гонки и стрельбу...

Пользователь вводит строку. Определить количество букв (рус eng), количество цифр и количество остальных - C++
в чем проблема не пойму работает на английских буквах на цифрах и остальные символы вроде считает а вот русские не хочет их забивает как...

Определить количество выигрышей, количество проигрышей и количество ничьих данной команды - C++
Недавно начал изучать язык С++ и уже застопорился. Помогите пожалуйста решить. 2.В массиве записаны результаты N игр футбольной...

В массиве записаны результаты N игр футбольной команды. Определить количество выигрышей, количество проигрышей и количество ничьих данной команды. - C++
Помогите пожалуйста решить задачу. НА С# труда не составляет а вот на С++ не получается. 1. В массиве записаны результаты N игр...

Определить количество слов в заданном тексте и количество символов в каждом слове - C++
Определить количество слов в заданном тексте и количество символов в каждом слове

Определить общее количество чисел и отдельно количество одно-, двух- и трехзначных - C++
Fixer_84, В файле записана последовательность одно-, двух- и трехзначных целых чисел (количество чисел может быть любым). Определить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Fulcrum_013
664 / 732 / 72
Регистрация: 14.12.2014
Сообщений: 5,701
Завершенные тесты: 3
05.07.2015, 23:51 #16
Цитата Сообщение от IrineK Посмотреть сообщение
C++
1
2
3
4
5
int R2, x, y;
//...
R2 = (x - j)*(x - j) + (y - 0) * (y - 0); 
* *if (R2 <= 100)
//...
C++
1
2
3
4
5
6
7
    int R, dx, x, y;
    //....
        dx = x - j; //чтобы лишнее не считать и буковок со скобками меньше писать
        R = dx*dx + y*y;
        if (R <= 100)
            counter += 1;
    //....
Кстати это решение там сейчас и стоит первым.

Добавлено через 5 минут
решение кстати некорректно, но тесты проходит. Нигде нет запрета на то чтобы поразить первой пулей пятую мишень а пятой первую, но это решение такие попадания не зачтет
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
06.07.2015, 11:53 #17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Кстати это решение там сейчас и стоит первым.
Возможно мы говорим про разные сайты, и да, уже не стоит. Решение и вправду некорректно если стрелять не по порядку. Добавление dx - не нужно, т.к. только увеличивает размер кода, можете проверить сами. Пока что вот так, хотя мне кажется, что можно его уменьшить, используя while вместо for:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
void main()
{
    int x, y, R, counter = 0;
    for (int j = 0; j < 101; j += 25)
    {
        cin >> x >> y;
        R = (x-j)*(x-j) + y*y;
        if (R < 101)
            counter += 1;
    }
    cout << counter;
}
Добавлено через 6 минут
Увы, от цикла ничего не зависит. Однако удалось использовать тернарную операцию:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
void main()
{
    int x, y, R, counter = 0, j=0;
    while (j < 101)
    {
        cin >> x >> y;
        R = (x - j)*(x - j) + y*y;
        counter += 1 ? R < 101 : 0;
        j += 25;
    }
    cout << counter;
}
Fulcrum_013
664 / 732 / 72
Регистрация: 14.12.2014
Сообщений: 5,701
Завершенные тесты: 3
06.07.2015, 12:28 #18
я про этот сайт.
http://********/index.asp?main=bstatus&id_t=440
Цитата Сообщение от Melvil Посмотреть сообщение
Добавление dx - не нужно, т.к. только увеличивает размер кода
ну если d а не dx то сокращает. читабельность правда страдает

Добавлено через 7 минут
a_c_m_p.ru
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
06.07.2015, 12:32 #19
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ну если d а не dx то сокращает. читабельность правда страдает
Как вообще возможно сократить данный код ещё на 25 символов ?
Fulcrum_013
664 / 732 / 72
Регистрация: 14.12.2014
Сообщений: 5,701
Завершенные тесты: 3
06.07.2015, 13:11 #20
Цитата Сообщение от Melvil Посмотреть сообщение
Как вообще возможно сократить данный код ещё на 25 символов
ну для начала с вместо counter

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
main()
{   
    int c = 0, R, x, d, y,j=0;
    while(j<101) 
    {
 
        std::cin >> x >> y;     
        d=x-j;
        R =d*d + y*y;
        if(R<101)c++;               
        j += 25;
    }
    std::cout << c;
}
крайний текст. Больше ее не ужать.

Добавлено через 2 минуты
Таки ужал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
main()
{   
    int c = 0, R, x,y,j=0;
    while(j<101) 
    {
 
        std::cin >> x >> y;     
        x-=j;
        R =x*x + y*y;
        if(R<101)c++;               
        j += 25;
    }
    std::cout << c;
}
Добавлено через 2 минуты
Но это был еще не предел.
А вот это уже похоже край:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
main()
{   
    int c = 0, R, x,y,j=0;
    while(j<101) 
    {
 
        std::cin >> x >> y;     
        x-=j;       
        if(x*x + y*y<101)c++;               
        j += 25;
    }
    std::cout << c;
}
Добавлено через 5 минут
край все таки вот: 126 байт
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
main()
{   
    int c = 0, x,y,j=0;
    while(j<101) 
    {
 
        std::cin >> x >> y;     
        x-=j;       
        if(x*x + y*y<101)c++;               
        j += 25;
    }
    std::cout << c;
}
Добавлено через 7 минут
А это почти за краем : 125 байт
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
main()
{   
    int c=0,j=0, x,y;
     while(j<5) 
    {
 
        std::cin >> x >> y;     
        x-=j*25;        
        if(x*x + y*y<101)c++;               
        j++;
    }
    std::cout << c;
}
Добавлено через 8 минут
точно за краем:124 байта
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
main()
{   
    int c=0,j=0, x,y;
    for(;j<5;j++) 
    {
 
        std::cin >> x >> y;     
        x-=j*25;        
        if(x*x + y*y<101)c++;                       
    }
    std::cout << c;
}
Fulcrum_013
664 / 732 / 72
Регистрация: 14.12.2014
Сообщений: 5,701
Завершенные тесты: 3
06.07.2015, 13:40 #21
Конкретно за краем: 108 байт, для непосвященных смертельно:
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
main()
{   
    int c=0,j=-1, x,y;  
    for(;j++<5;std::cin >> x >> y,x-=j*25,c+=x*x+y*y<101);
    std::cout << c;
}
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
06.07.2015, 15:04 #22
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Конкретно за краем: 108 байт, для непосвященных смертельно:
Я вот не очень понял к чему умножение на 25 и изменение цикла for ?

Добавлено через 10 минут
Visual Studio ругается на этот код, хотя проверки он проходит, можете пояснить?
Fulcrum_013
664 / 732 / 72
Регистрация: 14.12.2014
Сообщений: 5,701
Завершенные тесты: 3
06.07.2015, 15:34 #23
Цитата Сообщение от Melvil Посмотреть сообщение
Visual Studio ругается на этот код, хотя проверки он проходит, можете пояснить?
студия будет ругаться. как минимум потребует void перед main. а GNU C++ грызет тока так. она студия вообще дурная. к примеру на scanf ругается. У нее вообще новый вид ошибок появился - unsafe error
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2015, 15:34
Привет! Вот еще темы с ответами:

Определить количество лет, в которые количество осадков превышало среднегодовое - C++
В массиве хранятся сведения о количестве осадков, выпавших за пять лет по месяцам. Определить количество лет, в которые количество осадков...

Определить количество лет, в которые количество осадков превышало среднегодовое - C++
В массиве хранятся сведения о количестве осадков, выпавших за пять лет по месяцам. Определить количество лет, в которые количество осадков...

Определить количество положительных и количество отрицательных элементов заданного массива - C++
Определить количество положительных и количество отрицательных чисел массива

Определить количество положительных и количество отрицательных элементов до первого нуля. Найти ошибку в коде - C++
В маcсиве A(n) (n&lt;=7) хотя бы один элемент ноль. Определить количество положительных и количество отрицательных элементов до первого нуля! ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.07.2015, 15:34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru