万恶的训练题2023-2-2

问题 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 !=
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值