zoukankan      html  css  js  c++  java
  • hdu1937 Finding Seats

    hdu1937 Finding Seats

    题意是 求最小的矩形覆盖面积内包含 k 个 空位置

    枚举上下边界然后 双端队列 求 最小面积

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <queue>
    #include <stack>
    #include <set>
    #include <string>
    using namespace std;
    typedef long long ll;
    const double ESP = 10e-8;
    const int MOD = 1000000000+7;
    const int MAXN = 300+10;
    char graph[MAXN][MAXN];
    int sum[MAXN][MAXN];
    
    int main(){
       // freopen("input.txt","r",stdin);
        int R,C,K;
        while(scanf("%d%d%d",&R,&C,&K)){
            if(!R && !C && !K){
                break;
            }
            for(int i = 0;i < R;i++){
                scanf("%s",graph[i]);
            }
            memset(sum,0,sizeof(sum));
            for(int i = 1;i <= R;i++){
                for(int j = 1;j <= C;j++){
                    sum[i][j] = sum[i][j-1];
                    sum[i][j] += sum[i-1][j] - sum[i-1][j-1];
                    if(graph[i-1][j-1] == '.'){
                        sum[i][j]++;
                    }
                }
            }
            int ans = R * C;
            for(int x2 = R;x2 > 0;x2--){
                if(sum[x2][C] < K){
                    break;
                }
                for(int x1 = 1;x1 <= R;x1++){
                    if(sum[x2][C] - sum[x1-1][C] < K){
                        break;
                    }
                    int y1 = 1;
                    int y2 = 1;
                    while(y1 <= C && y2 <= C){
                        int cnt = sum[x2][y2]-sum[x1-1][y2]-
                        (sum[x2][y1-1] - sum[x1-1][y1-1]);
                        if(cnt < K){
                            y2++;
                        }else{
                            ans = min(ans,(x2-x1+1)*(y2-y1+1));
                            y1++;
                            if(y1 > y2){
                                break;
                            }
                        }
                    }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }

    upc3111 star 

    跟上面是类似的题,今年省赛的题 T_T

    求最小矩形面积覆盖的 星星数 至少 为 k 个

    就跟上面一样的题型了23333

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <queue>
    #include <stack>
    #include <set>
    #include <string>
    using namespace std;
    typedef long long ll;
    const double ESP = 10e-8;
    const int MOD = 1000000000+7;
    const int MAXN = 400+10;
    int graph[MAXN][MAXN];
    int sum[MAXN][MAXN];
    int main(){
        //freopen("input.txt","r",stdin);
        int t;
        scanf("%d",&t);
        while(t--){
            int n,k;
            scanf("%d%d",&n,&k);
            memset(graph,0,sizeof(graph));
            memset(sum,0,sizeof(sum));
            int stX = 400,edX = 1,stY = 400,edY = 1;
            while(n--){
                int a,b;
                scanf("%d%d",&a,&b);
                graph[a][b]++;
                stX = min(a,stX);
                stY = min(b,stY);
                edX = max(a,edX);
                edY = max(b,edY);
            }
            for(int i = stX;i <= edX;i++){
                for(int j = stY;j <= edY;j++){
                    sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
                    sum[i][j] += graph[i][j];
                }
            }
     
            int ans = (edX-stX+1)*(edY-stY+1);
            for(int x2 = edX;x2 >= stX;x2--){
                if(sum[x2][edY] < k){
                    break;
                }
                for(int x1 = stX;x1 <= edX;x1++){
                    if(sum[x2][edY] - sum[x1-1][edY] < k){
                        break;
                    }
                    int y1 = stY;
                    int y2 = stY;
                    while(y1 <= edY && y2 <= edY){
                        int cnt = sum[x2][y2] - sum[x2][y1-1]-(sum[x1-1][y2]-sum[x1-1][y1-1]);
                        if(cnt < k){
                            y2++;
                        }else{
                            ans = min(ans,(x2-x1+1)*(y2-y1+1));
                            y1++;
                            if(y1 > y2){
                                break;
                            }
                        }
                    }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Hash表解题之大数据查找
    数据结构与算法之字典树解题
    oracle存储过程学习
    mq常见问题
    通过反射构造对象
    平衡二叉树
    LinkList源码
    ArrayList源码
    JVM参数调优
    MyBatis源码图
  • 原文地址:https://www.cnblogs.com/hanbinggan/p/4678832.html
Copyright © 2011-2022 走看看