2011-10-30 6 views
1

私はこのパズルを解決しようとしています:Shipping Coding Puzzle。これは私がこれまでに出てきたコードです:g ++でC++プログラムのマイナーページフォールトを避ける

#include <fcntl.h> 
#include <sys/mman.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <sstream> 
#include <set> 
using namespace std; 
struct Container 
{ 
    Container(int c, int w) : cost(c), weight(w){} 
    int cost; 
    int weight; 
    bool operator<(const Container& c) const 
    { 
     return double(cost)/weight < double(c.cost)/c.weight; 
    } 
}; 
int main(int argc, char** argv) 
{ 
    int fd = open(argv[1], O_RDONLY); 
    char* pContent = (char*)mmap(NULL, 128 * sizeof(int), PROT_READ, MAP_PRIVATE, fd, 0); 
    pContent += 8; 
    stringstream ss(pContent); 
    int unload = 0; 
    ss >> unload; 
    set<Container> containers; 
    int cost = 0, weight = 0; 
    while(ss >> cost) 
    { 
     ss >> weight; 
     containers.insert(Container(cost, weight)); 
    } 

    const Container& best = *containers.begin(); 
    cost = best.cost * ceil(double(unload)/best.weight); 
    printf("%d\n", cost); 
    return 0; 
} 

私はこのロジックにいくつかのバグがあるかもしれないことは知っています。しかし、私の質問は論理に関連していません。このコードを提出すると、正常に実行されますが、マイナーページフォルト番号が409であるため、得点は少なくなります。リーダーボードを見ると、誰かがマイナーページフォールトのC++コードを提出した69です。これらのマイナーページフォルトを制御できる方法はありますか?いくつかのg ++​​フラグを使用している可能性がありますか?現在、私のmakeファイルは非常にシンプルです:g++ -o MyExe MyExe.cc

+0

この文脈で「マイナーページフォールト」とは何ですか? –

+0

私はそれが「需要ページング」でなければならないと信じます。そして、同じ結果を達成するために、他の人がすべて一緒に異なるアプローチを使用しているかもしれません。 –

+0

@Als私は彼がソフトページフォールトを意味すると確信しています(メモリがマークされていない場合) – Lockhead

答えて

2

あなたはこれらを判断するために何らかのアルゴリズムと実行環境Gildを使用しています。私はコンパイラのフラグはおそらく赤ちゃんだと思う。私は "リリースモード"で提出すると、あなたのために-O2または-O3をオンにすると思う。

私はそれがメモリ使用、おそらくメモリの局所性の最適化の問題だと思う。そのストリングストリームとセットは非常に高価になる可能性があります。あなたの靴では、別の方法があるかどうか、おそらくもっと調整されたアルゴリズムがあるかどうかを調べることになります。

関連する問題