Electric Fences[USACO]
非随机版的模拟退火
/* ID: zhangyc1 LANG: C++ TASK: fence3 */ #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std; int N; struct SLine { int nMin, nMax, nConst; bool bParallelX;//0 - 平行X轴, 1 - 平行Y轴 }; SLine arrLine[150]; int arrStepX[4] = {1, 0, -1, 0}; int arrStepY[4] = {0, 1, 0, -1}; const int nTries = 50; double dbMinDistance = 150000.0; void prepairData() { scanf("%d", &N); int n1, n2, n3, n4; for (int i = 0; i < N; i++) { scanf("%d%d%d%d", &n1, &n2, &n3, &n4); if (n1 == n3) {// 平行Y轴 arrLine[i].nConst = n1 * 10; arrLine[i].bParallelX = false; if (n2 < n4) { arrLine[i].nMin = n2 * 10; arrLine[i].nMax = n4 * 10; } else { arrLine[i].nMin = n4 * 10; arrLine[i].nMax = n2 * 10; } } else {// 平行X轴 arrLine[i].nConst = n2 * 10; arrLine[i].bParallelX = true; if (n1 < n3) { arrLine[i].nMin = n1 * 10; arrLine[i].nMax = n3 * 10; } else { arrLine[i].nMin = n3 * 10; arrLine[i].nMax = n1 * 10; } } } } double CalDist(int nx, int ny) { double dbSum = 0.0; for (int i = 0; i < N; i++) { int x, y; double dbCur = 0.0; if (arrLine[i].bParallelX) { x = ny; y = nx; } else { x = nx; y = ny; } if (y >= arrLine[i].nMin && y <= arrLine[i].nMax) dbCur = abs(x - arrLine[i].nConst); else if (y > arrLine[i].nMax) dbCur = sqrt((double)((x - arrLine[i].nConst) * (x - arrLine[i].nConst) + (y - arrLine[i].nMax) * (y - arrLine[i].nMax))); else dbCur = sqrt((double)((x - arrLine[i].nConst) * (x - arrLine[i].nConst) + (y - arrLine[i].nMin) * (y - arrLine[i].nMin))); dbSum += dbCur; } return dbSum; } void process() { int nSelX = 0, nSelY = 0; dbMinDistance = CalDist(0, 0); int t = 40; while (t) { for (int i = 0; i < nTries; i++) { int nOldX = nSelX, nOldY = nSelY; for (int j = 0; j < 4; j++) { double db = CalDist(nOldX + t * arrStepX[j], nOldY + t * arrStepY[j]); if (db < dbMinDistance) { dbMinDistance = db; nSelX = nOldX + t * arrStepX[j]; nSelY = nOldY + t * arrStepY[j]; } } } t = (int)(t * 0.8); } printf("%.1f %.1f %.1lf\n", nSelX/10.0, nSelY/10.0, dbMinDistance/10); } int main(){ FILE *streamIn = freopen("fence3.in","r",stdin); FILE *streamOut = freopen("fence3.out","w",stdout); prepairData(); process(); fclose(streamIn); fclose(streamOut); return 0; }