poj 1230 C++解法

来源:互联网 发布:帮助画画的软件 编辑:程序博客网 时间:2024/06/06 01:33
考察点:贪心策略思路:遍历每个column,如果这个column的wall数量n大于k,则抽掉其中n-k堵墙,抽掉墙的优先度按照墙横跨墙数超过k的column个数决定。Source CodeProblem: 1230 Memory: 328K Time: 0MS     Language: C++ Result: Accepted Source Code

    #include <iostream>    using namespace std;    //#define DEBUG    //1230    int n,k,t, maxCol,maxIndex;    int w[101][4];    int cols[101][101];    int walls[101][101];    void init() {    int i,j,min,max;    for (j = 0; j < 101; j++) {    cols[j][0] = 0;    walls[j][0] = 0;    }    for (j = 0; j < n; j++) {    min = w[j][0] < w[j][2] ? w[j][0] : w[j][2];    max = w[j][0] > w[j][2] ? w[j][0] : w[j][2];     for (i = min; i <= max; i++) {    cols[i][++cols[i][0]] = j;    walls[j][++walls[j][0]] = i;    }    }    }    void printCols() {    int i,j;    cout << "start printCols()" << endl;    for (i = 0; i < 101; i++) {    if (cols[i][0] > 0) {    cout << "col: " << i << "\t wallNum: \t" << cols[i][0];    for (j = 1; j <= cols[i][0]; j++) {    cout << " " << cols[i][j];    }    cout << endl;    }    }    cout << "end printCols()" << endl;    }    void removeWall(int index) {    int i,j,colIndex;    for (i = 1; i <= walls[index][0]; i++) {    colIndex = walls[index][i];    for (j = 1; j <= cols[colIndex][0]; j++) {    if (cols[colIndex][j] == index) {    cols[colIndex][j] = cols[colIndex][cols[colIndex][0]];    cols[colIndex][0]--;    break;    }    }    }    }    int findMax() {    int i;    int max = cols[0][0];    maxIndex = 0;    for (i = 1; i <= maxCol; i++) {    if (cols[i][0] > max) {    max = cols[i][0];    maxIndex = i;    }    }    return max;    }    int wallScore(int index) {    int i;    int c = 0;    for (i = 1; i <= walls[index][0]; i++) {    if (cols[walls[index][i]][0] > k) {    c++;    }    }    return c;    }    void process() {    int i, j, maxWall, maxWallIndex, ws, delta;    int c = 0;    init();    #ifdef DEBUG    printCols();    #endif    for (i = 0; i <= maxCol; i++) {        //printCols();    if (cols[i][0] > k) {    delta = cols[i][0] - k;    c += delta;    //cout << endl << "c: " << c << endl;    while (delta--) {    maxWall = wallScore(cols[i][1]);    maxWallIndex = cols[i][1];    for (j = 2; j <= cols[i][0]; j++) {    ws = wallScore(cols[i][j]);    if (ws > maxWall) {    maxWall = ws;    maxWallIndex = cols[i][j];    }    }    removeWall(maxWallIndex);    }    }    }    cout << c << endl;    }    int main(int argc, char *argv[])    {    int i,j;    cin >> t;    for (i = 0; i < t; i++) {    cin >> n >> k;    maxCol = 0;    for (j = 0; j < n; j++) {    cin >> w[j][0] >> w[j][1] >> w[j][2] >> w[j][3];    if (w[j][2] > maxCol) {    maxCol = w[j][2];    }    }        process();    }        return 0;    }