zoukankan      html  css  js  c++  java
  • POJ 1230 Pass-Muraille#贪心+vector迭代器用法

    (~ ̄▽ ̄)~*

    (注意下面代码中关于iterator的用法,此代码借鉴某大牛)

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    
    struct Wall
    {
        int row;//表示墙在哪行
        int left;
        int right;
    };
    
    int col[105];//保存每列的墙数
    vector<Wall> wall;
    
    int main()
    {
        int t,n,k,ax,ay,bx,by;
        scanf("%d",&t);
        while(t--)
        {
            wall.clear();
            memset(col,0,sizeof(col));
            scanf("%d%d",&n,&k);
            int maxright=0;
            int cnt=0;
            while(n--)
            {
                scanf("%d%d%d%d",&ax,&ay,&bx,&by);
                if(ax>bx)
                    swap(ax,bx);//有可能先输入墙的右端点
                if(bx>maxright)
                    maxright=bx;
    
                Wall temp;
                temp.row=ay; temp.left=ax; temp.right=bx;
                wall.push_back(temp);
                for(int i=ax;i<=bx;i++)
                    col[i]++;
            }
            int maxt;
            for(int i=0;i<=maxright;i++)
            {//前面maxright记录了所有墙中的最右端,这样遍历的时候,在maxright结束即可
                while(col[i]>k)
                {//遍历每列,当该列的墙数>k,说明需要删墙了
                    vector<Wall>::iterator it=wall.begin();//遍历迭代器
                    vector<Wall>::iterator iter;//临时迭代器
                    maxt=0;
                    while(it!=wall.end())
                    {//把右边界最大(right大于maxt)的墙(用iter记录)删掉(erase vector元素wall中的第iter个元素)
                        if((*it).left<=i)
                        {
                            if((*it).right>maxt)
                            {
                                maxt=(*it).right;
                                iter=it;
                            }
                        }
                        it++;
                    }
                    for(int j=(*iter).left;j<=(*iter).right;j++)
                        col[j]--;//删掉墙相关的记录
                    wall.erase(iter);//删掉墙
                    cnt++;
                }
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
  • 相关阅读:
    28
    27
    26
    25
    24
    23
    17
    16
    15
    14
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5210763.html
Copyright © 2011-2022 走看看