Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 75
1

Просрочен лимит времени

19.07.2013, 20:18. Просмотров 1294. Ответов 17
Метки нет (Все метки)

Я решал задачу, вот она:
Проблема в том, что я когда заносил в массив данные через scanf, то она выполнялась 2,5 секунды, а когда я использовал cin, то где-то 0.363 миллисекунды. В чем дело. Говорят же что scanf быстрее!!!
Вот сама программа, а считывание про которое я говорю находится в цикле for:
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
#include<iomanip>
#include<iostream>
#include<fstream>
#include<algorithm>
 
using namespace std;
 
int main()
{
    freopen("INPUT.TXT", "r", stdin);
    freopen("OUTPUT.TXT", "w", stdout);
    int a, q, w;
    scanf("%d", &a);
    int *b = new int[a];
    for(int index = 0; index<a; ++index) {
        scanf("%d", b[index]);
    }
    q = count(b, b+a, 1);
    w = count(b,b+a, 0);
    if(q>w) {
    printf("%d",w);
    }
    if(q<w) {
printf("%d",q);
    }
        if(q==w) {
printf("%d",q);
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2013, 20:18
Ответы с готовыми решениями:

Лимит по времени
Как можно сделать еще быстрее? Время работы 1.046 сек. Хотелось бы меньше 1.00 секунды:) ...

Счастливый билет (Лимит Времени)
Всем привет! Контестер пишет Time Limit. Подскажите что можно сделать чтоб моя программа работала...

Гистограмма (превышен лимит времени)
Гистограмма является многоугольником, сформированным из последовательности прямоугольников,...

Простейшая задача. Компилятор выдает ошибку "Превышен лимит времени"
Условие: Условный оператор. Задача 1 Дано целое четырехзначное число. Выяснить, является ли оно...

17
Модератор
Эксперт по электронике
8274 / 6133 / 822
Регистрация: 14.02.2011
Сообщений: 21,327
19.07.2013, 20:26 2
Цитата Сообщение от wwmwwm Посмотреть сообщение
if(q>w) {
printf("%d",w);
}
if(q<w) {
printf("%d",q);
}
if(q==w) {
printf("%d",q);
}
тот же эффект даст
C++
1
2
3
4
if(q>w)
 printf("%d",w);
else
 printf("%d",q);
или даже
C++
1
printf("%d",q>w?w:q);
а насчет скорости
покажи как делал с cin
какой размер файла?
0
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 75
19.07.2013, 20:54  [ТС] 3
Рамер тот же практически, а с cin я делал так: Вместо scanf("%d", b[index]); я сделал cin >> b[index];

Добавлено через 35 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
тот же эффект даст
C++
1
2
3
4
if(q>w)
 printf("%d",w);
else
 printf("%d",q);
или даже
C++
1
printf("%d",q>w?w:q);
а насчет скорости
покажи как делал с cin
какой размер файла?
Размер тот же практически, а с cin я делал так: Вместо scanf("%d", b[index]); я сделал cin >> b[index];
0
82 / 78 / 13
Регистрация: 14.06.2012
Сообщений: 261
19.07.2013, 21:02 4
О, недавно же решал.
Сравни, у тебя немного неправильный подход к задаче.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdio.h"
 
int main()
{
    int N, A = 0, B = 0, T;
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    
    scanf("%i", &N);
    for(int i = 0; i < N; i++)
    {
        scanf("%i", &T);
        if(T == 0) A++;
        else B++;
    }
    if(A > B) printf("%i", B);
    else printf("%i", A);
    return 0;
}
0
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 75
19.07.2013, 21:06  [ТС] 5
Цитата Сообщение от Neal Посмотреть сообщение
О, недавно же решал.
Сравни, у тебя немного неправильный подход к задаче.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdio.h"
 
int main()
{
    int N, A = 0, B = 0, T;
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    
    scanf("%i", &N);
    for(int i = 0; i < N; i++)
    {
        scanf("%i", &T);
        if(T == 0) A++;
        else B++;
    }
    if(A > B) printf("%i", B);
    else printf("%i", A);
    return 0;
}
Все правильно, и нет как у меня проблем с scanf, но а как быть со случаем равенства количества монет?
0
Эксперт С++
4254 / 2228 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.07.2013, 21:25 6
Цитата Сообщение от wwmwwm Посмотреть сообщение
scanf("%d", b[index]);
вы не ошиблись?
C++
1
scanf("%d", b + index);
C++
1
scanf("%d", &b[index]);
0
82 / 78 / 13
Регистрация: 14.06.2012
Сообщений: 261
19.07.2013, 21:49 7
Цитата Сообщение от wwmwwm Посмотреть сообщение
Все правильно, и нет как у меня проблем с scanf, но а как быть со случаем равенства количества монет?
Надо не только писать, но и хоть чуть-чуть проектировать..

Смотри. В переменных A и B считается количество монет с орлом или решкой (не важно, я не зацикливался, что куда)
Если, к примеру, A больше, то выводим B (в нем меньше кол-во монет, которое нужно перевернуть).
А остальное условие поставлено так, что если B больше, выведем A, но если они и равны, то выведем A.

Почему?
Да потому, что A=B ^ B=A, без разницы будет что выводить.

Добавлено через 1 минуту
Цитата Сообщение от Neal Посмотреть сообщение
Да потому, что A=B ^ B=A, без разницы будет что выводить.
Даже не так, а A=B => B=A
0
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 75
19.07.2013, 21:59  [ТС] 8
Цитата Сообщение от Neal Посмотреть сообщение
Надо не только писать, но и хоть чуть-чуть проектировать..

Смотри. В переменных A и B считается количество монет с орлом или решкой (не важно, я не зацикливался, что куда)
Если, к примеру, A больше, то выводим B (в нем меньше кол-во монет, которое нужно перевернуть).
А остальное условие поставлено так, что если B больше, выведем A, но если они и равны, то выведем A.

Почему?
Да потому, что A=B ^ B=A, без разницы будет что выводить.

Добавлено через 1 минуту

Даже не так, а A=B => B=A
И то так. Я просто не заметил. Но когда я исправил программу, и поставил указатель на массив, то у меня в принципе не хуже чем у тебя вышло. Правда условия мне нужно все таки укоротить. А о и 1 я считаю с помощью count
0
Модератор
Эксперт по электронике
8274 / 6133 / 822
Регистрация: 14.02.2011
Сообщений: 21,327
19.07.2013, 22:21 9
Цитата Сообщение от Neal Посмотреть сообщение
if(T == 0) A++;
else B++;
хочешь еще убыстрить?
не будет ветвления в цикле скорость возрастет
C++
1
2
A+=T==0;
B+=T==1;
или так
C++
1
2
A+=!T;
B+=!!T;
Цитата Сообщение от wwmwwm Посмотреть сообщение
А о и 1 я считаю с помощью count
а ты уверен что это быстрая функция?
тем более у Neal, один цикл а у тебя три один свой и два в count
1
82 / 78 / 13
Регистрация: 14.06.2012
Сообщений: 261
19.07.2013, 22:33 10
Цитата Сообщение от ValeryS Посмотреть сообщение
хочешь еще убыстрить?
не будет ветвления в цикле скорость возрастет
Спасибо, Валерий! Но это уже не так критично Там порог 1 сек., алгоритм успевает.
Хотел его уменьшить, но не получается, а какие-то умельцы до 114 символов уменьшают, у меня 244
Хотя я не разочарован, главное, чтобы код глазами нормально читался, а не был в виде байткода))))

Добавлено через 1 минуту
Спасибо за совет, обязательно использую ваш совет в других задач =)
0
193 / 173 / 30
Регистрация: 10.07.2012
Сообщений: 800
19.07.2013, 22:58 11
у acmр вообще все странно устроенно. бывали случаи, что один и тот же код при последовательных посылках работал за заметно различное время...
0
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 75
19.07.2013, 23:00  [ТС] 12
Цитата Сообщение от ValeryS Посмотреть сообщение

а ты уверен что это быстрая функция?
тем более у Neal, один цикл а у тебя три один свой и два в count
А и правда. А функция count быстро работает?
0
193 / 173 / 30
Регистрация: 10.07.2012
Сообщений: 800
19.07.2013, 23:12 13
вообще для этой задачи легко придумывается простое и лаконичное решение: посчитаем сумму на всем массиве, назовем ее S. ответом будет min(S, 100-S).

Добавлено через 10 минут
вообще для этой задачи легко придумывается простое и лаконичное решение: посчитаем сумму на всем массиве, назовем ее S. ответом будет min(S, N-S).
0
Заблокирован
Автор FAQ
19.07.2013, 23:32 14
Цитата Сообщение от wwmwwm Посмотреть сообщение
Проблема в том, что я когда заносил в массив данные через scanf, то она выполнялась 2,5 секунды, а когда я использовал cin, то где-то 0.363 миллисекунды. В чем дело. Говорят же что scanf быстрее!!!
- Вдумайся ещё раз в свои слова
я когда заносил в массив данные через scanf,
понимашь ли что для сравнения времени ввода нужно машинный ввод сравнивать?Скажем я вводил данные когда ел яблоко и одной рукой жмакал цифры а потом энтер, а второй раз водил двумя руками и что это одинаковые условия теста?
Функции имеют одинаковый временной интервал, с той лишь разницей что scanf это функция работающая с Сишным потоком stdin а cin является потоковым методом (если абстрагироваться , то той же функцией) используемй в С++.
Вобще нет абсолютно никакой разницы (подразумеваю время ввода) делать ли ввод в Си либо в С++ стиле.
0
193 / 173 / 30
Регистрация: 10.07.2012
Сообщений: 800
20.07.2013, 08:59 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
понимашь ли что для сравнения времени ввода нужно машинный ввод сравнивать?
люди вроде все не глупые: догадались. только разница все же есть. при "машинном вводе", насколько я понял смысл этого словосочетания.

Добавлено через 2 минуты
это подтверждает любой тестер (где, вы понимаете, никто вручную ничего не вводит). C-функции быстрее cin/cout. однако это решаемо.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.07.2013, 09:08 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
понимашь ли что для сравнения времени ввода нужно машинный ввод сравнивать?
У ТС потоки перенаправлены, ввод/вывод файловый, а не консольный.
0
-=ЮрА=-
20.07.2013, 10:16
  #17

Не по теме:

Всё увидел freopen. Воспринял как fopen

0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.07.2013, 10:18 18
wwmwwm, таже ошибка, что и в других темах:
C++
1
scanf("%d", &b[index]);
А при cin правильно будет, из-за этого, наверное, такой результат теста.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2013, 10:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

File_get_contents лимит времени на выполнение
Подскажите пожалуйста, допустим я хочу прочитать содержимое удаленного файла при помощи...

В час ночи появляется окошечко. Лимит времени 15 минут. Потом комп отключается.
С недавних пор появляется окошечко написано лимит времени 15 минут. По прошествии 15 минут комп...

Документ просрочен
С какого-то времени на некоторых сайтах в FireFox начала появляться такая надпись -&quot;Документ...

как сделать расчет Просрочен продукт или нет?
как сделать расчет Просрочен продукт или нет? + чтобы результат заносился в таблицу(раздел Итого)...

как сделать расчет Просрочен продукт, или нет?
что бы в Итого: записывало просрочен он , или нет

Библиотека: вывести информацию и книгах, срок возврата которых просрочен не более, чем на N дней
есть пример я начала его преределывать но не совсем понимаю что написано в программе, т.к. не...


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

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

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