#c #performance #input #io
#c #Производительность #ввод #io
Вопрос:
Я новичок в конкурентном программировании. Я решал этот вопрос (https://www.codechef.com/problems/SUMTRIAN ) и упоминается, что этот вопрос требует быстрого ввода-вывода. Я тестировал свою функцию f на время, и это заняло 1 микросекунду, а ввод-вывод занял 44505 микросекунд. Следовательно, я считаю, что ввод-вывод является узким местом
Мое решение заключается в следующем
int fastscan()
{
int x{};
bool neg = false;
register int c;
x = 0;
c = char();
// for(;(c<48||c>57);c=char());
if (c == '-') {
neg = true;
c = char();
}
for (; (c > 47 amp;amp; c < 58); c = char())
x = (x << 1) (x << 3) c - 48;
if (neg)
x *= -1;
return x;
}
long long unsigned int f(array<int, 10005>amp; arr, long long int max, long long int cur, long long int n)
{
if (cur n >= max)
return arr[n];
long long int count{ 0 }, count1{ 0 };
count = f(arr, max, cur 1, n cur);
count1 = f(arr, max, cur 1, n cur 1);
count = count > count1 ? count : count1;
return count arr[n];
}
int main(int argc, char const* argv[])
{
ios::sync_with_stdio(0);
cin.tie(NULL);
long long int t{};
std::cin >> t;
int n{};
array<int, 10005> arr;
while (t--) {
n = fastscan();
int temp = n * (n 1) / 2;
int max = temp;
while (temp--) {
arr[max - temp - 1] = fastscan();
}
return 0;
long long int c{};
c = f(arr, max, 1, 0);
std::cout << c << 'n';
}
return 0;
}
Но при отправке он показывает превышение временного предела. одно из принятых решений заключается в следующем
#define mod 1000000007
#define ll long long
#define sc(x) scanf("%d",amp;x)
#define scll(x) scanf("%lld",amp;x)
#define pr(x) printf("%dn",x)
#define prll(x) printf("%lldn",x)
#define gc getchar_unlocked
#define pc putchar_unlocked
inline int scan()
{
register int c = gc();
int x = 0;
for (; (c < 48 || c > 57); c = gc())
;
for (; (c > 47 amp;amp; c < 58); c = gc()) {
x = (x << 1) (x << 3) c - 48;
}
return x;
}
inline void print(int a)
{
char snum[20];
int i = 0;
do {
snum[i ] = a % 10 48;
a = a / 10;
} while (a != 0);
i = i - 1;
while (i >= 0)
pc(snum[i--]);
pc('n');
}
int a[100][100];
int sum(int n)
{
int i, j;
for (i = 0; i < n; i ) {
for (j = 0; j <= i; j ) {
a[i][j] = scan();
}
}
for (i = 1; i < n; i ) {
for (j = 0; j <= i; j ) {
if (j == 0)
a[i][j] = a[i - 1][j];
else if (j == i)
a[i][j] = a[i - 1][j - 1];
else {
a[i][j] = max(a[i - 1][j], a[i - 1][j - 1]);
}
}
}
int mm = 0;
for (j = 0; j < n; j ) {
if (a[n - 1][j] > mm)
mm = a[n - 1][j];
}
return mm;
}
int main()
{
int t, n;
t = scan();
while (t--) {
n = scan();
print(sum(n));
}
}
время, измеренное на моей машине для моего кода, меньше принятого кода …. тем не менее, выполнение принятого кода на codechef занимает 0,01 секунды, а моего — 3,01.
может кто-нибудь, пожалуйста, помочь??
Комментарии:
1.
fastscan
всегда возвращает одно и то же значение иreturn 0
заставляет ваш внешний цикл while выполняться только один раз?2. Учитывая очевидную алгоритмическую разницу между вашим кодом и принятым кодом (просто сравните вашу
f
функцию с принятойsum
функцией), почему вы думаете, что проблема в скорости ввода-вывода? Сайты конкурентного кодирования, как правило, предназначены для выбора наилучшего алгоритма, а не для максимизации скорости ввода-вывода.3. @AlanBirtles Как бы это ни было ужасно, я предполагаю, что
char()
на самом деле это макрос для чтения символов (какgc()
в другом коде).4. Если вам нужно настроить ввод-вывод, чтобы сделать код достаточно быстрым, почти всегда есть алгоритм, который работает еще быстрее без этого.
5. Довольно мило, что принятое решение использует оба
register
иinline
, ни одно из которых не влияло на время выполнения буквально десятилетиями. Это чисто карго-культовое программирование.