** Description changed:

  If I compile the code using g++ and -O2 optimization and try the algorithm
  with this input "10000 100 10" I get a wrong answer.
  I can get the correct solution if I compile the same code don't using any 
optimization.
  
  
  #include <algorithm>
  #include <cstdlib>
  #include <cstdio>
  #include <cmath>
  
  using namespace std;
  
  #define DEBUG
  
  struct Point
  {
     double x, y;
     Point() : x(0), y(0) {}
     Point(const double _x, const double _y) : x(_x), y(_y) {}
  };
  
  struct Retta
  {
     double x, y, z;
     Retta() : x(0), y(0), z(0) {}
     Retta(const Point& p1, const double m)
     {
        // y - y1 = m(x - x1)
        x = m;
        y = -1;
        z = p1.y-m*p1.x;
     }
     Retta(const Point& p1, const Point& p2)
     {
        if (p1.x == p2.x)
        {
           x = 1;
           y = 0;
           z = -p1.x;
        }
        else if (p1.y == p2.y)
        {
           x = 0;
           y = 1;
           z = -p1.y;
        }
        else
        {
           double m = (p1.y-p2.y)/(p1.x-p2.x);
           x = m;
           y = -1;
           z = p1.y-m*p1.x;
        }
     }
  };
  
  Point p1, p2, p3;
  Retta r1, r2;
  
  const double EPS = 1E-6;
  
  int solve()
  {
     int sols = 0;
-    double x1, x2, x3, x4;
+    double x1, x2;
     for (int i = 1; i < p2.y; i++)
     {
        x1 = ((-r1.y*i-r1.z)/r1.x);
        x2 = ((-r2.y*i-r2.z)/r2.x);
  
  
-       x3 = (ceil(x1) == x1 ? x1+1 : ceil(x1));
-       x4 = (floor(x2) == x2 ? x2-1: floor(x2));
+       x1 = (ceil(x1) == x1 ? x1+1 : ceil(x1));
+       x2 = (floor(x2) == x2 ? x2-1: floor(x2));
  
-       sols += static_cast<int>(x4-x3+1);
+       sols += static_cast<int>(x2-x1+1);
        #ifdef DEBUG
           printf("level %d = [%lf, %d] [%lf, %d]  D = %lf [%d]\n", i, x1, i, 
x2, i, x2-x1+1, sols);
        #endif
     }   
     return sols;
  }
  
  void read(FILE* in)
  {
     int a, b, c;
     fscanf(in, "%d%d%d", &a, &b, &c);
     p1 = Point(0, 0);
     p2 = Point(a, b);
     p3 = Point(c, 0);   
     r1 = Retta(p1, p2);
     r2 = Retta(p3, p2);
     #ifdef DEBUG
        printf("R1: %lf x + %lf y + %lf = 0\n", r1.x, r1.y, r1.z);
        printf("R2: %lf x + %lf y + %lf = 0\n", r2.x, r2.y, r2.z);
     #endif
  }
  
  int main()
  {
     FILE* in = fopen("fence9.in", "r");
     FILE* out = fopen("fence9.out", "w");
     #ifdef DEBUG
        in = stdin;
        out = stdout;
     #endif
     read(in);
     fprintf(out, "%d\n", solve());
     return 0;
  }

-- 
Seem optimization -O2 don't work g++
https://launchpad.net/bugs/82190

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to