速通ACM省铜第十五天 赋源码(Creating a Schedule)
目录
引言:
Creating a Schedule:
题意分析
逻辑梳理
代码实现
结语:
引言:
不知不觉速通ACM系列已经更新半个月了,回首这半个月刷的题,心里真是五味杂陈,但看着这么多绿的1300-1500的题,又有了满满的成就感,从一开始打1400的题非常艰难,基本要花一下午或者一天时间才能想出来的题,而现在却能在半个小时左右就可以开出来了,真是令人感慨,那么,先来看一下这十五天刷的题,如图
相信坚持看我速通ACM专栏的友友们现在能力也有了很大的提升(很大可能是思维上的提升),那么接下来,我们就接着进行今天的ACM速通吧
今天我们要讲的题是上图中最下面的一个AC题,这是一道CF评级为1400的题, 那么接下来,就进入今天的题目讲解啦————————>
Creating a Schedule:
那么,按照惯例,我们先来看题目
题意分析
题目链接在这里Problem - 2111D - Codeforces
不想跳转的可看下图(沉浸式翻译插件出问题了,换了一个翻译插件)
题目意思其实很简单, 就是给你n个组和m个教室
然后一天要上6节课,一个教室只能容纳一个小组,不可以多个小组在一间教室上课
然后校长想要让所有组上完课后爬的楼梯数加起来要最多
让你输出爬楼梯最多时每个小组的上课教室分配方式
题目就这么简单,那么我们进入逻辑梳理环节
逻辑梳理
这个的逻辑其实也很好梳理,比起一堆教室乱跳,明显俩个教室之间往返上课是最可行的,那么什么时候是上下楼层最多的呢,那就是最低层到最高层教室,这就是上下楼层最多的
那么第一组确定完了,第二组此时不能往里压,因为1个组是在俩个教室来回跳上课,所以当第一组在其中一间教室上课时候,另一间教室肯定是空的
这个时候第二个教室就可以去那间教室去上课,那么等下课时候,第一组和第二组的教室刚好对调,所以俩个教室可以供2个组上课
那么第三个组怎么分配呢,自然就是最低的教室往上找一间,最高的教室往下找一间,这便是第三组和第四组的教室了,那么有人就会问了,为什么这样会让他们爬楼梯的次数最多呢
那么我们就来假设,最高层是h1,次高层是h2,最底层是l1,次底层是l2,若按上面的方案来看,最多的爬楼梯是(h1-l1)*2+(h2-l2)*2,有的人可能会想那最高和次高,次高和最低这样会不会使爬楼梯增多,事实是不会的,这种情况他们的爬楼梯数量是(h1-l2)*2+(h1-l1)*2,这很明显,和上面的式子是一样的,所以明显可以用上面的那个方式来找方案就可以啦
那么这个时候就要特别注意了,那就是小组数量是不确定的,而按上面的方案来输出,为了优化时间复杂度,只有6个元素的情况下肯定是直接输出的,那么一次会输出俩个小组,奇数情况下就会出问题,所以只要特判一下就可以啦
那么,逻辑梳理完啦,接下来我们来看具体的代码实现
代码实现
需要注意的在逻辑梳理里面都已经讲清楚啦,那么,就直接上AC码啦
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <vector>
using namespace std;int t;
long long a[100010];void solve()
{int n, m;cin >> n >> m;for (int i = 1; i <= m; i++){cin >> a[i];}sort(a + 1, a + m + 1);for (int i = 1; i <= n / 2; i++){cout << a[i] << " " << a[m - i + 1] << " " << a[i] << " " << a[m - i + 1] << " " << a[i] << " " << a[m - i + 1] << endl;cout << a[m - i + 1] << " " << a[i] << " " << a[m - i + 1] << " " << a[i] << " " << a[m - i + 1] << " " << a[i] << endl;}if (n % 2){int i = n / 2 + 1;cout << a[i] << " " << a[m - i + 1] << " " << a[i] << " " << a[m - i + 1] << " " << a[i] << " " << a[m - i + 1] << endl;}
}int main()
{cin >> t;while (t--){solve();}return 0;
}
那么,这题就讲解完啦
结语:
今日算法讲解到此结束啦,希望对你们有所帮助,谢谢观看,如果觉得不错可以分享给朋友哟。当然也可以关注一下,有什么看不懂的可以评论问哦