题意:R*S 的电影院座位图,B 个坏掉的座位。所有人的左右两侧不能有人,问整个影院最多坐多少人,最少坐多少人。
对每一行单独处理。
最大值是两个人隔着坐,如果有一段连续的区间长度是 L,那么最大值是 ceil(L/2)。
最小值是一个人可以占连续的三个位置,那么最小值就是 ceil(L/3)。
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
//freopen("a.txt", "r", stdin);
int t; cin >> t;
for(int cas = 1; cas <= t; cas++){
int r, s, rr, ss;
scanf("%d%d", &r, &s);
int pic[r][s];
memset(pic, 0, sizeof(pic));
int b;
scanf("%d", &b);
while(b--){
scanf("%d%d", &rr, &ss);
pic[rr][ss] = 1;
}
int cnt = 0, maxx = 0, minn = 0;
for(int i = 0; i < r; i++){
for(int j = 0; j < s; j++){
if(pic[i][j] == 0){
cnt++;
}
if(pic[i][j] != 0 || (pic[i][j] == 0 && j == s-1)){
maxx += ceil(1.0*cnt/2);
minn += ceil(1.0*cnt/3);
cnt = 0;
}
}
}
printf("Case #%d: %d %dn", cas, maxx, minn);
}
return 0;
}