首页 > 其他分享 >[JOI 2022 Final] 自学 题解

[JOI 2022 Final] 自学 题解

时间:2023-07-26 15:25:07浏览次数:66  
标签:int 题解 mid day 达到目标 JOI calc 自习 Final

洛谷传送门

1.题意简述:

一个学期有 \(N\) 天 \(N*M\) 节课,每天的第 \(i\) 节课可以选择效果 \(a_i\) 的学习与 \(b_i\) 的自习。问应如何安排每节课,使所有功课最小值最大?

2.思路:

这道题想直接模拟非常麻烦,但是如果我们能够灵活运用二分算法,这道题就非常简单了。

考虑到数据范围较大,我们可以在 \(0 - {10}^{18}\) 的范围内二分枚举答案,写一个 \(check\) 函数判断答案是否成立。

在 \(check\) 函数中,我们不妨枚举范围较小的天数 \((1 \leq n \leq 3e5)\) ,对于每天的 \(m\) 节课,我们采用贪心策略,即当自习效率高于上课效率时,我们优先使用自习。因为每天上课次数只有 \(m\) 次,而自习次数是无限的。。。

若上课效率更高,则分两种情况讨论:

  • 1.可以在 \(m\) 节课内达到二分枚举的答案,则全部上课;

  • 2.不可以在 \(m\) 节课内达到目标,则将 \(m\) 个机会全部用上,再将剩下效率通过自习完成。

最后如果通过上述情况实现后仍无法达到目标,则返回 \(false\),若 \(n\) 天后仍没有退出,返回 \(true\)。

3.注意事项:

  • 1.在判断是否达到目标时,我们不必统计课程效率,可以统计达到目标最少所需的课程数,这样统计似乎更加简单。。。

  • 2.注意统计课程数时,因为需要用到除法的向上取整,而c++中的 \(ceil()\) 函数精度问题比较大,所以推荐使用不带 \(double\) 类型的向上取整函数:

int calc (int x, int y) {
	return x / y + (x % y != 0);
}

4.代码实现:

#include <bits/stdc++.h>
#define int long long

using namespace std;

#define N 300010
#define For(i,j,k) for(int i=j;i<=k;i++)
#define IOS ios::sync_with_stdio(),cin.tie(),cout.tie()

int n, m, a[N], b[N];

int calc (int x, int y) {
	return x / y + (x % y != 0);
}

bool check (int mid) {
	int day = 0;
	For (i, 1, n) {
		if (b[i] > a[i]) day += calc (mid, b[i]);
		else if (a[i] * m >= mid) day += calc (mid, a[i]);
		else day += m + calc (mid - a[i] * m, b[i]);
		if (day > n * m) return false;
	}
	return true;
}

signed main () {
	IOS;
	cin >> n >> m;
	
	For (i, 1, n) cin >> a[i];
	For (i, 1, n) cin >> b[i];
	
	int l = 0, r = LLONG_MAX;
	while (l <= r) {
		int mid = l + r >> 1;
		if (check (mid)) {
			l = mid + 1;
		} else {
			r = mid - 1;
		}
	}
	
	cout << l - 1 << endl;
	return 0;
}

标签:int,题解,mid,day,达到目标,JOI,calc,自习,Final
From: https://www.cnblogs.com/linbaicheng/p/17582546.html

相关文章

  • luogu P9474 [yLOI2022] 长安幻世绘 详细题解
    原题:P9474[yLOI2022]长安幻世绘看到很多大佬的题解直接讲了做法,本蒟蒻看得不是很懂,调了很久才把这题做出来,于是写了这篇比较详细的题解谈一下我做这题从头到尾的思路,希望对各位有帮助qwq。思路我们首先思考这样一个问题,如果已经知道最终答案对应的最大值和最小值,又不知道题......
  • 【Java异常】Variable used in lambda expression should be final or effectively fi
    https://blog.csdn.net/weixin_44299027/article/details/117333667*lambda表达式中使用的变量应该是final或者有效的final*,也就是说,lambda表达式只能引用标记了final的外层局部变量,这就是说不能在lambda内部修改定义在域外的局部变量,否则会编译错误......
  • AT_agc017_b 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法,请放心阅读。题目简述一共有\(n\)个格子,给定两个整数\(A,B\)分别位于第\(1\)和第\(n\)格,中间有\(n−2\)个空格。询问是否存在一种填数方案满足任意相邻两个数之差的绝对值在\([C,D]\)之间。依次输入\(n,a,b,c,d\)......
  • AT_arc149_a 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述求满足以下条件的小于\(10^n\)数最大是多少?每一位数字均相同;是\(m\)的倍数。数据范围:\(1\len\le10^5\),\(1\lem\le10^9\)。思路首先每位数字都相同很好满足,仅需......
  • 题解:【ICPC WF 2021 L】 Where Am I?
    题目链接这年WF较为简单的一道了,直接模拟即可。首先可以预处理出它顺时针螺旋轨迹的移动步数,方便过会算距离直接查表。我偷懒直接用map记录的距离表,这样不用处理复数下标的问题。注意到\(X\)的数量不会超过\(100\)个,所以我们可以反过来从标记点上入手。找出所有的标记点,......
  • 洛谷 P2894 [USACO08FEB] Hotel G 题解
    题目链接P2894[USACO08FEB]HotelG-洛谷|计算机科学教育新生态(luogu.com.cn)分析考虑用线段树维护区间信息维护sum(最大连续空房间数)如何合并?sum1为max(sum2,sum3)(1的两个子区间)但我们发现若区间为100001(0表示空房间)sum1=4而max(sum2,sum3)=2所以再维护suml(从左开始的......
  • 网络并发每日习题解释版
    网络并发每日习题解释版1.软件开发架构类别软件开发架构类别:软件开发架构是指在软件设计和开发过程中,用于组织和管理软件系统的基本结构。常见的软件开发架构类别包括:分层架构(LayeredArchitecture):将软件系统划分为多个相互独立的层,每个层都有特定的功能和责任。客户端......
  • Java面试题 P5:简述final作用
    1、简述final作用?final含义是最终的。(1)修饰类:表示类不可被继承,不可以有子类;(2)修饰方法:表示方法不可以被子类覆盖,但是可以重载;(3)修饰变量:表示变量一旦被赋值就不可以更改它的值。(4)修饰成员变量如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初......
  • 【题解】Educational Codeforces Round 150(CF1841)
    赛时过了A-E,然后就开摆了,为什么感觉C那么无厘头[发怒][发怒]排名:25thA.GamewithBoard题目描述:Alice和Bob玩游戏,他们有一块黑板。最初,有\(n\)个整数\(1\)。Alice和Bob轮流操作,Alice先手。轮到时,玩家必须在棋盘上选择几个(至少两个)相等的整数,擦除它们,然后写一个......
  • 题解 BZOJ4543【[POI2014] HOT-Hotels】
    长链剖分优化DP板子题了,但是虽然是板子这个转移方程也很难想。problem树。求\(\sum_{1\leqi<j<k\leqn}[dist(i,j)=dist(i,k)=dist(j,k)].\)。\(n\leq10^5\)。solution与重链剖分相似,长链剖分是将树剖成很多条长链。我们定义长儿子,为一个点的儿子中子树深度最大的一个儿......