Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
测试了N多数据都未发现错误,狂郁闷中...哪位牛大侠可否帮忙看下,到底是哪里出错了,不胜感激 或者是给出一组有问题的测试数据也行#include <iostream> //#include <algorithm> //#include <fstream> using namespace std; struct Col { int value; int row; }; struct Grid { int value; int wall; }; int QSCore(struct Col L[], int left, int right) { int base = L[left].value; int temp = L[left].row; while (left < right) { while (L[right].value >= base && right > left) right--; L[left].value = L[right].value; L[left].row = L[right].row; while (L[left].value <= base && left < right) left++; L[right].value = L[left].value; L[right].row = L[left].row; } L[left].value = base; L[left].row = temp; return left; } void QS(struct Col L[], int left, int right) { int middle; if (right > left) { middle = QSCore(L, left, right); QS(L, left, middle - 1); QS(L, middle + 1, right); } } int main() { //data definition int t, n, k; struct Grid grid[120][120]; int pass[120]; struct Col col[120]; int i, j, p, q, u, w, int_temp; int beginX, endX, beginY, endY; int maxX, maxY; int count; //input data //ifstream input("data.txt"); cin >> t; for (w = 0; w < t; w++) { count = 0; cin >> n >> k; maxX = 0; maxY = 0; for (i = 0; i < 101; i++) for (j = 0; j < 101; j++) { grid[i][j].value = 0; grid[i][j].wall = -1; } for (i = 0; i < n; i++) { cin >> beginX >> beginY >> endX >> endY; if (beginX > endX) { int_temp = beginX; beginX = endX; endX = beginX; } if (endX > maxX) maxX = endX; if (endY > maxY) maxY = endY; for (j = beginX; j <= endX; j++) { grid[endY][j].value = 1; grid[endY][j].wall = i; } } //scan grid to get value of pass for (i = 0; i <= maxX; i++) { pass[i] = 0; for (j = 0; j <= maxY; j++) { if (grid[j][i].value == 1) pass[i]++; } } //scan grid again for (i = 0; i <= maxX; i++) { if (pass[i] <= k) continue; for (j = 0; j <= maxY; j++) { col[j].row = j; if (grid[j][i].value == 0) col[j].value = 0; else { col[j].value = 1; for (p = i + 1; p <= maxX; p++) { if (grid[j][p].value == 1 && grid[j][p].wall == grid[j][i].wall) col[j].value++; else break; } } } QS(col, 0, maxY); for (p = maxY, j = pass[i]; j > k && p >= 0; j--, p--) { u = i + 1; q = col[p].row; while (grid[q][u].value == 1 && u <= maxX && grid[q][u].wall == grid[q][i].wall) { grid[q][u].value = 0; grid[q][u].wall = -1; pass[u]--; u++; } count++; } } cout << count << endl; } return 0; } 思路是这样子的: >把所有点都用grid[][]记录,value值是墙为1,非墙为0;wall值记录属于哪一条墙的,若无墙则为-1 >从左往右遍历, >如遇某列超出K了,假设超出M个 >在该列上选取对后面影响最大的M条墙,去除后 >继续遍历. >去掉多少条墙,就是答案了。 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator