SPOJはコンソール(std::cout
)の出力を探しています。残念ながら、これはテストが実際には醜いものになります。なぜなら、出力には数秒かかり、グラフィックスカードの限界に向かってプログラムランタイムを歪ませ、共通コンソールは出力全体を保持することができず、 。
解決策1:出力をstd :: coutを使用してコンソールに出力しますが、オペレーティングシステムがコンソール出力をファイルにリダイレクト(AKAパイプ)します。これは、両方のウィンドウと私が演奏したほとんどすべての* nixの変形で、次の演算子で行われます。
program.exe > outputfile.txt
>
オペレータはリダイレクトを通知します。これを実証する
シンプルなハックテストコードは次のとおりです。
test > test.txt
典型的な出力として実行
#include <iostream> //cout
#include <chrono> // clock
#include <cstring> //memset
char courtMatrix[90000];
void printFile(char * matrix,
size_t len)
{
for (size_t i = 0; i < len - 1; i++)
{
std::cout << matrix[i] << "\n";
}
std::cout << matrix[len - 1];
}
int main()
{
// not using c-style standard IO, no sense paying for it.
std::cout.sync_with_stdio(false);
//initialize array contents
memset(courtMatrix, '.', sizeof(courtMatrix));
//start timer
auto start = std::chrono::high_resolution_clock::now();
//TODO generate output here
//print output
printFile(courtMatrix, sizeof(courtMatrix));
// compute duration
auto dur = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - start);
//output execution time. Note cerr, not cout. Different data stream and
//won't pipe to file
std::cerr << "Execution time : " << dur.count() << std::endl;
return 0;
}
:1つのtest.txtのファイルと
実行時間:0
速報(size_t
) size_t
は、システム上で表現可能な最大のオブジェクトを索引付けするのに十分な大きさの符号なし整数です。つまり、構築可能な配列を処理するのに十分な大きさです。また、負の数をテストする必要がなくなり、負の数が大きな正の値にラップされ、上限のチェックによって捕捉されるため、そのようなことをする必要はありません。インデックスに便利です。
トピックに戻ると、上記のprintFile
の出力はSPOJによって拒否されます。出力要件は2Dマトリックスを必要とし、これを逸脱するとおそらく失敗するからです。その場合:
void printFile(char * matrix,
size_t len,
size_t rowlength)
{
size_t rowleft = rowlength;
for (size_t i = 0; i < len; i++)
{
std::cout << matrix[i] << ' ';
rowleft--;
// test if we've printed an entire row
if (rowleft == 0)
{
// we have, so end the line and reset the counter
rowleft = rowlength;
std::cout << '\n';
}
/* could use the more elegant-looking
if (i % rowlength) std::cout << '\n';
but the % operator is often pretty expensive compared to --
As always, test it and find out which suits your needs better.
*/
}
}
は、2次元配列を使用して恐れてはいけないと、ここでループのネストされました。最適化されたコンパイラがそれで実行されると、読みやすさが向上します。私が間違っていれば、プロファイリングのビットがかなり素早くあなたに伝えられます。
なぜこのタグはCですか? –
I/Oの所要時間は、プラットフォームとストリームの種類によって大きく異なります。たとえば、コンソール端末への書き込みは、ファイルへの書き込みよりもずっと遅くなります。 – EOF
実際の実行環境に完全に依存します。 –