问题 H. Block
题目描述
Alice得到了一张由n×m个黑白像素点组成的图片,她想要压缩这张图片。压缩图片的过程如下:
1.首先,选择一个正整数k(k>1),将图片划分成若干个k×k的小块。如果n,m不能被k整除,用白色像素点在图片的右边或下面补全,使补全成n,m都能被k整除。
2.由于压缩时每个k×k的小块必须颜色一致(即全黑或者全白),所以需要先改变某些像素点的颜色,然后再进行压缩。
在Alice可以自由的选择任意一个大于1的正整数k作为小块的边长的情况下,请你告诉Alice,她至少需要改变多少个像素点的颜色。
输入
输入的第一行包含两个由空格隔开的正整数n,m(2≤n,m≤1000),表示图片的尺寸。
接下来n行,每行包含一个长度为m的”01”串,表示Alice得到的那张图片。”0”表示一个白色像素点,”1”表示一个黑色像素点。
输出
输出一个整数,表示Alice要压缩她的图片至少需要改变颜色的像素点的个数。
样例
样例输入 Copy
3 5
00100
10110
11001
样例输出 Copy
5
提示
选择k=2,图片被补全为,如下:
001000
101100
110010
000000
为使每个2×2的小块颜色一致,改变颜色为,如下:
001100
001100
000000
000000
可以发现这是所有情况中改变颜色的像素点数最少的,改变了5个像素点的颜色(答案为5的改色方案不止这一种)。
二位前缀和解题
#include<bits/stdc++.h>
typedef long long LL;
const int inf=0x3f3f3f3f;
const int N=2e3+100;
LL maze[N][N];
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> maze[i][j];
for (int i = 1; i <= n * 2; i++)
for (int j = 1; j <= m * 2; j++)
maze[i][j] += maze[i - 1][j] + maze[i][j - 1] - maze[i - 1][j - 1];
LL ans = inf;
for (int k = 2; k <= min(m, n); k++) {
LL sum = 0;
for (int i = k; i <= 2 * n; i += k)
for (int j = k; j <= 2 * m; j += k) {
LL c = maze[i][j] - maze[i - k][j] - maze[i][j - k] + maze[i - k][j - k];
sum += min(llabs(c - 1LL * k * k), c);
}
ans = min(ans, sum);
}
cout << ans << endl;
}
安装饮水机
题目描述
为倡导城市低碳生活,市文明办计划举办马拉松比赛,为确保比赛安全,沿途设置了一些观察点。每个观察点派一个观察员驻守。由于天气比较炎热,需要在沿途安装一些饮水机,使得观察员可以去取水喝。由于观察员每移动一个单位的路程,需要耗费一个单位的体力。而每个观察员的体力有限,只能在他体力能支持的范围内去取水喝,要不他就会渴死或累死。
聪明的楠楠也参与了这次比赛的筹备工作。他的任务是设计一个理想的安装饮水机方案,使得安装的饮水机最少,但又保证所有观察员都能取到水喝。
输入
输入数据有若干行。。
第一行,仅一个整数,表示有N(0<n<=1000)个观察点。
接下来有N行,每行两个整数S(0<S<=100000)和W(0<W<=50000),其中S表示某个观察点到起点的路程,W表示该观察点中驻点观察员的体力。
输出
输出最少要安装几台饮水机。
样例
样例输入 Copy
4
6 3
12 2
1 5
14 5
样例输出 Copy
2
提示
他可以将饮水机安装在距离起点为6和12的位置上,这样所有的观察员都能喝到水。方案有多种,只需输出最少需要几台饮水机即可。
二分法解题
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1010;
int n;
struct answ{
int a, b;
}q[N];
bool cmp(const answ &x, const answ &y) {
if (x.a + x.b !=