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
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
@PaulMcKenzie Ich habe diesen Code aus dem Lösungshandbuch https://ncpc.idi.ntnu.no/ncpc2005/ gestohlen. Ich werde jetzt einen Debugger durchlaufen –
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