首页 > 其他分享 >课堂练习 最大值 原题链接+题解

课堂练习 最大值 原题链接+题解

时间:2024-03-09 15:25:07浏览次数:23  
标签:课堂练习 原题 int 题解 sum sv maxn ans check

题目可以去我的洛谷题库看:https://www.luogu.com.cn/problem/U412348(带数据,真难出)

题解

考虑两种解题方式。

由于题目范围较小,可以 check+暴力,如果范围大一点,可以 check+二分答案。

先讲 check 函数,小学四年级数学书说了,这种问题也被它叫做“铺地砖”问题,计算剪出的正方形数量的方法是:

\[\lfloor长\div边长\rfloor \times \lfloor 宽 \div边长\rfloor \]

所以check函数的写法是:

int check(int x){
  int ans = 0;
  for (auto i : sv){
    ans += (i.w / x) * (i.h / x);
  }
  return ans;
}

直接写 int,懒得 bool 了。我就不写暴力了,写二分。

二分的话要注意,区间是 \(\textcolor{red}{[}1, maxn\textcolor{red}{]}\),对于无解判定的话,只需要考虑 \(\sum w_ih_i\) 是否大于等于 \(k\),小于输出 -1

代码:

#include <bits/stdc++.h>
using namespace std;

struct paper{
  int w, h;
};

vector <paper> sv;

int check(int x){
  int ans = 0;
  for (auto i : sv){
    ans += (i.w / x) * (i.h / x);
  }
  return ans;
}

int main(){
  int n, k, maxn = INT_MIN, sum = 0;
  cin >> n >> k;
  
  for (int i = 0; i < n; i ++){
    int a, b;
    cin >> a >> b;
    sv.push_back({a, b});
    sum += a * b;
    maxn = max(maxn, min(a, b));
  }

  if (sum < k){
    cout << -1;
    return 0;
  }

  int l = 0, r = 1001;
  while (l < r - 1){
    int ret = check((l + r) / 2);
    if (ret < k){
      r = (l + r) / 2;
    }else{
      l = (l + r) / 2;
    }
  }
  if (check(l) == k) cout << l;
  else cout << r;
}

心情舒畅。提示一下,洛谷上开的是二分的时间限制,暴力可能不过

标签:课堂练习,原题,int,题解,sum,sv,maxn,ans,check
From: https://www.cnblogs.com/mayile/p/18062739/ktlx-zdz-sol

相关文章

  • 一本通 1270 混合背包 题解
    是在hydro上做的,墙裂推荐hydro的一本通题库!链接是:https://hydro.ac/d/ybttk/p/T1270。分析一下,可以分类讨论,处理的时候,零一背包(\(p_i=1\))一个,完全背包(\(p_i=0\))一个,多重背包(\(p_i>1\))一个,状态转移方程不用列的,直接去抄模板就可以啦~代码是这样的捏:#include<bits/st......
  • P6583 回首过去 题解
    P6583回首过去题解题目传送门好题。更新(2023-12-05):把代码和$\LaTeX$改得更好看了。题意简述给定正整数$n$,求出有序整数对$(x,y)$的个数,满足$1\lex,y\len$且$\dfracxy$可以表示为十进制有限小数。$1\len\le10^{12}$。前置知识数论分块解法Subtas......
  • CF1846D Rudolph and Christmas Tree 题解
    因为\(n\)个三角形有重叠部分,所以我们可以倒序处理每个三角形,并对其进行分类讨论:若当前三角形编号为\(n\),则直接将总面积加上\(\dfrac{d\timesh}{2}\)。否则,再次分出两种情况:若当前三角形的\(y_i+h>y_{i+1}\)(即编号为\(i,i+1\)的三角形有重叠),则如下图所示:......
  • CF387B George and Round 题解
    考虑采用双指针法解决此题。首先需要对\(a,b\)数组排序,并且维护两个指针\(l,r\),分别指向\(a,b\)两个数组中的元素。接着循环移动\(r\)指针,每次都尝试匹配\(a_l\)和\(b_r\):若\(a_l\leb_r\),则说明\(a_l=b_r\)或可以采用减少\(b_r\)的方式使\(a_l=b_r\),这......
  • P3670 [USACO17OPEN] Bovine Genomics S 题解
    题意给定\(2\)组字符串,每组\(n\)个,每个字符串包含\(m\)个字符。我们称一个三元组\((i,j,k)\)是合法的,当且仅当第二组的每个字符串中下标为\((i,j,k)\)的字符拼成的字符串与第一组的每个字符串中下标为\((i,j,k)\)的字符拼成的字符串均不相等。现在需要你对于给定的......
  • CF99B Help Chef Gerasim 题解
    分别对三种情况进行分类讨论。第一种情况:显然,若\(\sum^{n}_{i=1}a_i\bmodn\neq0\),则输出\(\texttt{Unrecoverableconfiguration.}\);同时,我们遍历\(a_{1\simn}\),若存在两个以上的\(a_i\)满足\(a_i\neq\sum^{n}_{i=1}a_i\divn\),则也输出\(\texttt{Unreco......
  • P10217 [省选联考 2024] 季风题解
    考场上没写出来,火大,实际上这题放校内%你赛我肯定写的出来,可惜这是省选。实际上这题不难,主要是观察性质,接着拆柿子,然后就是有点难写,要写得好看有点考验代码构建能力和数学能力。我们考虑原题的每对\((x,y)\)都要满足\(|x|+|y|\lek\)而我们可以知道后面应该填的\((x,y)\)如......
  • CF348A Mafia 题解
    由于题目具有十分明显的单调性(若\(x\)局能满足要求,则\(>x\)局一定能满足;若\(x\)局无法满足要求,则\(<x\)局也无法满足),因此我们考虑进行二分答案。二分所需要的局数\(x\),设所有人想玩的总局数为\(S\),由题意可得\(S=\sum^{n}_{i=1}a_i\)。因为每局都会有\(1\)人主持,\(n......
  • [ABC297F] Minimum Bounding Box 2 题解
    容斥真有趣。有一个性质:两个相同的子矩阵,对答案的贡献一定相同。所以就只需要枚举矩阵大小即可。我们设当前矩阵长\(i\)宽\(j\)(对应的,\(H\)为长,\(W\)为宽),假如要给答案做出贡献,矩阵的四条边一定都有点,发现可以容斥了。至少\(0\)条边上有点的方案数为\(a=C_{i\times......
  • P4139 上帝与集合的正确用法 题解
    传送门我觉得这题最有意思的其实是"最终会固定为一个数"这个结论。扩展欧拉定理:\(a^b\bmodp\),当\(b\ge\varphi(p)\)时,\(a^b\equiva^{b\bmod\varphi(p)+\varphi(p)}\pmodp\)。所以\(2^{2^{2^{\cdots}}}\)可以递归求解。边界条件\(p=1\)。复杂度如何保证?其实就是......