Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

12.05.2011, 17:48. Просмотров 1719. Ответов 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 минуты
контр-пример
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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, В файле записана последовательность одно-, двух- и трехзначных целых чисел (количество чисел может быть любым). Определить...

22
x1Mike7x
218 / 131 / 6
Регистрация: 06.11.2010
Сообщений: 234
12.05.2011, 17:49 #2
А почему все проверки координат производятся по модулю?
Что, если во входном потоке данные (-25; 0), что = промаху, а засчитается как (25; 0)
0
Temirlan90
133 / 133 / 8
Регистрация: 30.09.2010
Сообщений: 333
12.05.2011, 18:01  [ТС] #3
x1Mike7x, если у "х" убрать abs, то 4 тест проваливает
0
valeriikozlov
Эксперт С++
4672 / 2498 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.05.2011, 18:55 #4
Temirlan90, Условия никуда не годятся:
(Для 1-го нормально), а для остальных:
Цитата Сообщение от Temirlan90 Посмотреть сообщение
else if(abs(x) + abs(y) >= 15 && abs(x) + abs(y) <= 35 && t2 != 1) {
t2 = 1;
++count;
}
например x=-20 y=-10
получится что 2-ая мишень поражена.
Попробуйте добавить еще к остальным (кроме первого условия) что x>0
1
x1Mike7x
218 / 131 / 6
Регистрация: 06.11.2010
Сообщений: 234
12.05.2011, 19:05 #5
В принципе да, оно по-любому завалится... =)
Условие проверки должно быть другое. А именно:
1) Вводятся координаты точки куда попали
2) Проверяем для каждого центра мишени расстояние от центра к точке попадания
C++
1
R = sqrt( (X2 - X1) * (X2 - X1) + (Y2 - Y1) * (Y2 - Y1) )
3) Если R <= 10, тогда записываем для этой мишени попадание

Выйдет что-то типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for ( i = 0; i < 5; ++i )
{
    cin >> X >> Y;
    for ( j = 0; j < 101; j += 25 )
    {
        R = sqrt( (X - j) * (X - j) + (Y - 0) * (Y - 0) );
        if ( R <= 10 )
        {
            used[ j / 25 ] = 1;
            break;
        }
    }
}
for ( i = 0; i < 5; ++i )
    K += used[i];
cout << K;

Вот, кстати, контр-пример:
Х = 13
Y = 3
Должен быть промах.
1
Temirlan90
133 / 133 / 8
Регистрация: 30.09.2010
Сообщений: 333
14.05.2011, 11:06  [ТС] #6
valeriikozlov, Добавил условие, все равно 7 тест проваливает.
x1Mike7x, в Вашем примере
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
#include <iostream>
#include <cmath>
using namespace std;
int main() {
    float R, X, Y;
    int used[100], K = 0;
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    for (int i = 0; i < 5; ++i) {
        cin >> X >> Y;
        for (int j = 0; j < 101; j += 25) {
            R = sqrt((X - j) * (X - j) + (Y - 0) * (Y - 0));
            if (R <= 10) {
                used[j / 25] = 1;
                break;
            }
        }
    }
    for (int i = 0; i < 5; ++i)
        K += used[i];
    cout << K;
    /*system("pause >> void");*/
    return 0;
}
при 2 тесте ответ выдает -1717986917 О_о
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.05.2011, 12:38 #7
Ваша ошибка в слишком правильном понимании условия. Там никакая не окружность, а всего-лишь квадрат.
Решается "в лоб"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <map>
short is(int x, int y){
    if (y>11||y<-11) return 0;
    if (x>-11&&x<11) return 1;
    if (x>14&&x<36) return 2;
    if (x>39&&x<61) return 3;
    if (x>64&&x<86) return 4;
    if (x>89&&x<111) return 5;
    return 0;
}
int main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int x,y,i=5;
    std::map<int,int> m;
    while (i--){
        std::cin >> x >> y;
        if (is(x,y)) m[is(x,y)]++;
    }
    std::cout << m.size();
    return 0;
}
1
x1Mike7x
218 / 131 / 6
Регистрация: 06.11.2010
Сообщений: 234
14.05.2011, 16:50 #8
Ошибка на 2м тесте из-за отсутствия зануления массива.
Вот так должно быть.
C
1
int used[5] = {};
И, к тому же, массив на 100 элементов не нужен, в цикле мы же делим j на 25 (т.е. никогда индекс больше 100/25 = 4 не получится) при записи единицы.
P.S. И там таки круг, а не квадрат.
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.05.2011, 16:51 #9
Неет... Поверьте мне как человеку, сдавшему эту задачу(решение в 7 посте под катом, проходит все тесты)
Всего лишь неверное условие, тоже бывает. В биатлоне, кстати, нельзя попасть два раза в одну и ту же мишень, т.к. после попадания ее уже и нету...
0
Live4Sky
6 / 1 / 1
Регистрация: 04.10.2013
Сообщений: 42
03.02.2014, 13:55 #10
Цитата Сообщение от x1Mike7x Посмотреть сообщение
Ошибка на 2м тесте из-за отсутствия зануления массива.
Вот так должно быть.
C
1
int used[5] = {};
И, к тому же, массив на 100 элементов не нужен, в цикле мы же делим j на 25 (т.е. никогда индекс больше 100/25 = 4 не получится) при записи единицы.
P.S. И там таки круг, а не квадрат.
Решил по вашем способу,не знаю какие там квадраты...в общем вот код все работает
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
#include <fstream>
#include <cmath>
using namespace std;
int main() {
    float radius,x, y;
    int used[100]={};
    int count=0;
    ifstream cin("input.txt");
    ofstream cout("output.txt");
    for (int i = 0; i<5; i++) {
        cin>>x>>y;
        for (int j = 0; j <= 100; j += 25) {
            radius = sqrt((x - j) * (x - j) + (y - 0) * (y - 0));
            if (radius <= 10) {
                used[j / 25] = 1;
                break;
            }
        }
    }
    for (int i = 0; i < 5; ++i){
        count+=used[i];
    }
    cout<<count;
 
}
Добавлено через 19 минут
Цитата Сообщение от Live4Sky Посмотреть сообщение
Решил по вашем способу,не знаю какие там квадраты...в общем вот код все работает
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
#include <fstream>
#include <cmath>
using namespace std;
int main() {
    float radius,x, y;
    int used[100]={};
    int count=0;
    ifstream cin("input.txt");
    ofstream cout("output.txt");
    for (int i = 0; i<5; i++) {
        cin>>x>>y;
        for (int j = 0; j <= 100; j += 25) {
            radius = sqrt((x - j) * (x - j) + (y - 0) * (y - 0));
            if (radius <= 10) {
                used[j / 25] = 1;
                break;
            }
        }
    }
    for (int i = 0; i < 5; ++i){
        count+=used[i];
    }
    cout<<count;
 
}
только одного не пойму зачем used[j / 25] = 1;
0
Melvil
48 / 47 / 13
Регистрация: 20.05.2015
Сообщений: 251
04.07.2015, 13:48 #11
Фух, сидел разбирался столько времени, наконец, могу с уверенностью предложить кратчайший вариант решения задачи с пояснением. Проходит все тесты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cmath> // Для работы sqrt 
#include <iostream>
using namespace std;
void main()
{
    int counter = 0; // Счётчик
    double R, x, y; // Объявление переменных типа double, дабы работало sqrt.
    int used[5] = {}; // Создание массива, который полон нулей.
    for (int j = 0; j < 101; j += 25) // Счётчик. Во-первых отсчитывает 5 мишеней. Во-вторых, служит индикатором заполненности массива.
    // В третьих,  дальностью радиуса мишеней.
    {
        cin >> x >> y; // Ввод кординат
        R = sqrt((x - j)*(x - j) + (y - 0) * (y - 0)); // Считаем расстояние от точки до центра мишени
        if (R <= 10) // Если точка в зоне радиуса
        used[j / 25] = 1; // Заполняем элемент массива
    }
    for (int i = 0; i < 5; i++) // Заполнение "главного" счётчика
    {
        counter += used[i]; // Собираем все единицы из массива
    }
    cout << counter << endl; // Вывод.
}
0
Melvil
48 / 47 / 13
Регистрация: 20.05.2015
Сообщений: 251
05.07.2015, 20:00 #12
Пожалуй самое короткое решение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cmath>
#include <iostream>
using namespace std;
void main()
{
    int counter = 0;
    double R, x, y;
    for (int j = 0; j < 101; j += 25)
    {
        cin >> x >> y;
        R = sqrt((x - j)*(x - j) + (y - 0) * (y - 0));
        if (R <= 10)
            counter += 1;
    }
    cout << counter;
}
P.S.

Первое место по скорости, памяти и размеру среди всех прочих решений.
0
Fulcrum_013
699 / 764 / 74
Регистрация: 14.12.2014
Сообщений: 6,036
Завершенные тесты: 3
05.07.2015, 22:41 #13
Цитата Сообщение от Melvil Посмотреть сообщение
Первое место по скорости, памяти и размеру среди всех прочих решений.
Можно гораздо быстрее
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
05.07.2015, 22:45 #14
Цитата Сообщение от Melvil Посмотреть сообщение
Фух, сидел разбирался столько времени
4 года? Поздравляю.
0
IrineK
Заблокирован
05.07.2015, 23:05 #15
Цитата Сообщение от Melvil Посмотреть сообщение
C++
1
2
R = sqrt((x - j)*(x - j) + (y - 0) * (y - 0)); 
   if (R <= 10)
Цитата Сообщение от Temirlan90 Посмотреть сообщение
два целых числа xi и yi - координаты точки
C++
1
2
3
4
5
int R2, x, y;
//...
R2 = (x - j)*(x - j) + (y - 0) * (y - 0); 
   if (R2 <= 100)
//...
будет быстрее.
Да и <cmath> не нужен.
0
05.07.2015, 23:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2015, 23:05
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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