2016-12-23 3 views
2

Я нашел решение этой проблемы Kattis:Как изменить синтаксис UNIX, чтобы получить правильный результат?

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

но он использует> = Unix синтаксис, который мне нужно изменить, чтобы скомпилировать в Kattis?. Я изменил их на std :: min и std :: max соответственно, но я не получаю правильный ответ (каждый раз я получаю Майкла).

Оригинальный код:

/* 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"); 
    } 
} 

И мой 3 изменения:

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 

вход является

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 

Выход должен быть

Mikael 
Nils 
Nils 
Mikael 

Но после того, как изменения я получаю

Mikael 
Mikael 
Mikael 
Mikael 
+1

Когда вы использовали отладчик, где программа отклоняется от логики, которую вы написали? И в чем причина неортодоксального использования 'scanf'? Почему бы не просто 'cin',' getline' или какой-нибудь другой более известный идиом C++? – PaulMcKenzie

+0

@PaulMcKenzie Я украл этот код из руководства по решению https://ncpc.idi.ntnu.no/ncpc2005/. Теперь я буду работать с отладчиком. –

+0

. Идеальный способ отладить это - иметь две программы, в которых одна программа имеет оригинальная реализация, а другая - ваши изменения. Затем вы можете отлаживать оба «одновременно» и видеть, где ваша программа идет в другом направлении, чем исходная программа. – PaulMcKenzie

ответ

0

После прочтения над комментариями я понял, что я сделал максимум (а, б), но не делал = тах (а, б), так после того, как я сделал это изменение он работает так, как ожидалось. Изменения вступили в силу:

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); 

Спасибо за помощь!

Смежные вопросы