2016-12-23 1 views
2

Ich habe eine Lösung für dieses Problem gefunden Kattis:Wie ändert man UNIX-Syntax, um korrekte Ausgabe zu erhalten?

https://open.kattis.com/problems/funnygames

aber es nutzt> = Unix-Syntax, die ich ändern muß in Kattis zu kompilieren?. Ich änderte sie zu std :: min und std :: max, aber ich bekomme nicht die richtige Antwort (ich bekomme Michael jedes Mal).

Originalcode:

/* Sample solution to "Funny Games" from NCPC 2005 
* Algorithm: essentially continuous DP, keep track of winning intervals 
* Author: Per Austrin 
*/ 
#include <cmath> 
#include <cassert> 
#include <algorithm> 
#include <cstdio> 

using namespace std; 

typedef pair<double, double> pdd; 

template <class It, class OIt> 
OIt ival_union(It begin, It end, OIt dest) { 
    sort(begin, end); 
    while(begin != end) { 
    *dest = *begin++; 
    while(begin != end && begin->first < dest->second + 1e-8) 
     dest->second >?= begin++->second; //Change 1 
    ++dest; 
    } 
    return dest; 
} 

int main(void) { 
    int n, k; 
    double x, f[10], maxf; 
    pdd win[10000], lose; 
    for (scanf("%d", &n); n--;) { 
    scanf("%lf%d", &x, &k); 
    maxf = lose.second = 0; 
    for (int i = 0; i < k; ++i) 
     scanf("%lf", f+i), win[i] = make_pair(1, 1/f[i]), maxf >?= f[i]; //Change 2 
    for (int nwin = k, l = 0; x > lose.second; ++l) { 
     nwin = ival_union(win + l , win + nwin, win + l) - win; 
     lose.second = (lose.first = win[l].second)/maxf; 
     if (l < nwin-1) lose.second <?= win[l+1].first; //Change 3 
     for (int i = 0; i < k; ++i) 
    win[nwin++] = make_pair(lose.first/f[i], lose.second/f[i]); 
    } 
    assert(fabs(x-lose.first) > 1e-6 && fabs(x-lose.second) > 1e-6); 
    printf("%s\n", x < lose.first ? "Nils" : "Mikael"); 
    } 
} 

Und meine drei Änderungen:

std::max(dest->second, begin++->second); //Change 1 

scanf("%lf", f + i), win[i] = make_pair(1, 1/f[i]), std::max(maxf, f[i]); //Change 2 

if (l < nwin - 1) std::min(lose.second, win[l + 1].first); //Change 3 

Der Eingang ist

4 
6 2 0.25 0.5 
10 2 0.25 0.5 
29.29 4 0.3 0.7 0.43 0.54 
29.30 4 0.3 0.7 0.43 0.54 

Die Ausgabe sollte

Mikael 
Nils 
Nils 
Mikael 
012 sein

Aber nachdem die Änderungen, die ich bekommen

Mikael 
Mikael 
Mikael 
Mikael 
+1

Wenn Sie den Debugger verwendet haben, wo weicht das Programm von der Logik ab, die Sie geschrieben haben? Und was ist der Grund für die unorthodoxe Verwendung von 'scanf'? Warum nicht einfach "cin", "getline" oder ein anderes vernünftiges C++ - Idiom? – PaulMcKenzie

+0

@PaulMcKenzie Ich habe diesen Code aus dem Lösungshandbuch https://ncpc.idi.ntnu.no/ncpc2005/ gestohlen. Ich werde jetzt einen Debugger durchlaufen –

+0

Der ideale Weg, dies zu debuggen, ist, zwei Programme zu haben, in denen ein Programm das hat Original-Implementierung und die andere hat Ihre Änderungen. Sie können dann beide "gleichzeitig" debuggen und sehen, wo Ihr Programm in eine andere Richtung als das ursprüngliche Programm geht. – PaulMcKenzie

Antwort

0

Nach dem Lesen der Kommentare über mir klar, ich max tat (a, b), aber keine = max (a, b) tun, nachdem ich gemacht, dass der Wandel es funktioniert wie erwartet. Die Änderungen sind:

dest->second=std::max(dest->second, begin++->second); 

scanf("%lf", f + i), win[i] = make_pair(1, 1/f[i]), maxf=std::max(maxf, f[i]); 

if (l < nwin - 1) lose.second=std::min(lose.second, win[l + 1].first); 

Danke für die Hilfe!

Verwandte Themen