#include using namespace std; const int MAX=1000; struct point { int x, y, z; } b[MAX]; // balloon locations struct line { point start; int delx, dely, delz; int n; // number of balloons hit by line (>=3) int *list; // list of balloons } lines[MAX/3]; int nlines; int minLines; // minimum number of lines used (set in bestCover) bool onLine(point p, line l) { int dx = p.x-l.start.x; int dy = p.y-l.start.y; //cout << " dx, dy = " << dx << ',' << dy << endl; //cout << " delx, dely = " << l.delx << ',' << l.dely << endl; if (dx*l.dely != dy*l.delx) return false; int dz = p.z-l.start.z; if (dz*l.dely != dy*l.delz) return false; //cout << " dx, dz = " << dx << ',' << dz << endl; //cout << " delx, delz = " << l.delx << ',' << l.delz << endl; return (dx*l.delz == dz*l.delx); } void getLines(int n) // determine lines which pass through 3 or more balloons { int i, j, k; int list[MAX], count; nlines = 0; for(i=0; i=0; k--) { if (lines[k+1].n < lines[k].n) break; line temp = lines[k+1]; lines[k+1] = lines[k]; lines[k] = temp; } //cout << endl; nlines++; } } } } void bestCover(int i, int numL, int numB, int hits[], int cover, int linesUsed) { //cout << "i, cover, linesUsed" << i << ',' << cover << ',' << linesUsed << endl; int j; if (i == numL || numB-cover <=2) { if (linesUsed + (numB-cover+1)/2 < minLines) { minLines = linesUsed + (numB-cover+1)/2; } } else if (linesUsed + (numB-cover)/lines[i].n >= minLines) return; else { // use line i; int newHits=0; for(j=0; j> n; while (n != 0) { icase++; int *hits = new int[n]; for(i=0; i> b[i].x >> b[i].y >> b[i].z; hits[i] = 0; } getLines(n); //for(i=0; i> n; } return 0; }