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

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

Восстановить пароль Регистрация
 
wwmwwm
 Аватар для wwmwwm
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 75
19.07.2013, 20:18     Просрочен лимит времени #1
Я решал задачу, вот она:
Проблема в том, что я когда заносил в массив данные через 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2013, 20:18     Просрочен лимит времени
Посмотрите здесь:

C++ Как увеличить лимит на количество символов в консоли
Разница во времени C++
Перевод времени C++
C++ Измерение времени
C++ Лимит
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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
какой размер файла?
wwmwwm
 Аватар для wwmwwm
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];
Neal
81 / 77 / 2
Регистрация: 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;
}
wwmwwm
 Аватар для wwmwwm
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, но а как быть со случаем равенства количества монет?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 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]);
Neal
81 / 77 / 2
Регистрация: 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
wwmwwm
 Аватар для wwmwwm
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
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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
Neal
81 / 77 / 2
Регистрация: 14.06.2012
Сообщений: 261
19.07.2013, 22:33     Просрочен лимит времени #10
Цитата Сообщение от ValeryS Посмотреть сообщение
хочешь еще убыстрить?
не будет ветвления в цикле скорость возрастет
Спасибо, Валерий! Но это уже не так критично Там порог 1 сек., алгоритм успевает.
Хотел его уменьшить, но не получается, а какие-то умельцы до 114 символов уменьшают, у меня 244
Хотя я не разочарован, главное, чтобы код глазами нормально читался, а не был в виде байткода))))

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

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

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2013, 10:18     Просрочен лимит времени
Еще ссылки по теме:

C++ Лимит памяти для решений задач
Лимит по времени C++
C++ Лимит char в msvc

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.07.2013, 10:18     Просрочен лимит времени #18
wwmwwm, таже ошибка, что и в других темах:
C++
1
scanf("%d", &b[index]);
А при cin правильно будет, из-за этого, наверное, такой результат теста.
Yandex
Объявления
20.07.2013, 10:18     Просрочен лимит времени
Ответ Создать тему
Опции темы

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