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\n",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\n",ans);
    }
    return 0;
}
时间: 2024-11-03 21:25:56

hdu1937 Finding Seats的相关文章

HDU 1937 F - Finding Seats

F - Finding Seats Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1937 Description A group of K friends is going to see a movie. However, they are too late to get good tickets, so they are looki

UVa 11846 Finding Seats Again 题解

难度:β 建议用时:40 min 实际用时:1 h 题目:?? 代码:?? 这题我又是在很短时间 A 过去. 因为我又看别人的题解了. 这题用 DFS 搜索,剪枝没什么的. 搜索方案就是从一个固定点开始往下往右(根据我自己的坐标系来看)拉出一个矩型,然后判断有几个队长,符不符合队长要求的人数条件,然后吧啦吧啦继续搜. 很简单的(看完题解后的我想到). 就是在处理矩形上面要注意一下细节.剪枝就是减掉枚举时矩形的边的范围,使新画的矩形不会和之前的重合. 我好奇的是为什么只剪列,不剪行.这个细节值得思

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

Soj题目分类

-----------------------------最优化问题------------------------------------- ----------------------常规动态规划  SOJ1162 I-Keyboard  SOJ1685 Chopsticks SOJ1679 Gangsters SOJ2096 Maximum Submatrix  SOJ2111 littleken bg SOJ2142 Cow Exhibition  SOJ2505 The County

POJ 2049 Finding Nemo 优先队列 STL

题目链接:http://poj.org/problem?id=2049 题目利用了<海底总动员>的情节,小丑鱼尼莫迷路了,他老爸去营救他便是题意. 题目给出了这样的地图,说是假设地图由墙和门组成,忽略墙的厚度,地图上有门,没有墙的地方是可以自由行动的问可以经过最少多少道门便可以营救到尼莫. 这个题给的数据是墙的交点为整数点,但鱼爸爸实在非墙的地方自由移动. 因此,这个题有两个难点: 1.如果建图保存地图 2.如何在地图上遍历 由于题目是给出一个点(x,y),来表示一段墙 我便用一对X,Y来表示

Finding Lines

Finding Lines 题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4967 概率 在听题解前毫无头绪,题解帮我打开了新世界的大门: 随机取一个点在答案直线(如果存在这个直线)上的概率是p%, 那么随机取到两个点构成的直线就是答案直线的概率是p%*p%: 也就是说,随机取到两个点构成的直线不是答案直线的概率为

基于分治法的找秩(maxium rank finding)策略

rank finding 问题的概述如下: 在一群离散的点中,检查对于每个点,是否有x值和y值都小于它的点,若有,则该点的秩为这些小于它的点的数量. 分治法思想: 以界面上所有点中x值的中位数为基准,递归地把目标区域分成两部分,直到每个区域中的点在一个以下,对于每一个细小的区域,检查其left child区域中的点的y值和right child区域中的点的y值,以对right child中的点的秩进行统计. 该方法通过分治排除了水平位置不符合标准的点,有效的减少了统计次数. 代码示例如下: #i