首页 > 其他分享 >洛谷题单指南-贪心-P4447 [AHOI2018初中组] 分组

洛谷题单指南-贪心-P4447 [AHOI2018初中组] 分组

时间:2024-02-26 18:22:21浏览次数:29  
标签:P4447 AHOI2018 int 洛谷题 最少 分组 mp 人数 结尾

原题链接:https://www.luogu.com.cn/problem/P4447

题意解读:将一个有序的数列,按不重复连续数分成一组,可分成若干组,使得人数最少的组在各种分组方式之中是最大的。

解题思路:

观察样例说明,有6个测试点的ai​互不相同,因此直接将数据排序,然后连续数分成一组,计算每组数量最少的,即为答案,60分到手。

60分代码:

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

const int N = 100005;

int a[N], n;
int ans = N;

int main()
{
    cin >> n;

    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);

    int cnt = 1;
    for(int i = 2; i <= n; i++)
    {
        if(a[i] - a[i-1] != 1)
        {
            ans = min(ans, cnt);
            cnt = 1;
        }
        else cnt++;
    }

    ans = min(ans, cnt);
    cout << ans;
    
    return 0;
}

如何进一步优化?

最关键的问题是实力值数据会出现重复的情况,每个分组都必须连续且不能重复,因此可以采用如下贪心策略:

核心思想是对每一个数,评估应该加入哪个分组,为了使分组人数更加均衡,应该优先加入可以加入的人数最少的分组。

1、先将所有数据由小到大排序

2、对于每一个实力值数据,寻找是否有分组可以加入

3、如果有分组可以加入,则加入该分组;如果有多个分组可以加入,则加入人数最少的分组;否则,创建一个新的分组

4、遍历所有分组,人数最少的即为答案

要实现以上策略,关键的数据结构为

map<int, priority_queue<int, vector<int>, greater<int>> > mp;
 mp存储所有以key结尾的分组人数,使用优先队列是为了方便快速找到人数最少的分组 算法过程描述如下: 1、对实力值由小到大哦排序 2、遍历每一个实力值a   3、判断在mp中是否存在以a-1结尾的分组   4、如果存在则取以a-1结尾的分组最少人数cnt     5、在mp中移除以a-1结尾的最少人数分组     6、在mp中添加以a结尾的人数是cnt+1的分组   7、如果在mp中不存在以a-1结尾的分组     8、在mp中添加以a结尾的人数是1的分组 9、遍历mp,取分组最少的人数

100分代码:

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

const int N = 100005;

int a[N], n;
map<int, priority_queue<int, vector<int>, greater<int>> > mp; //key:value,表示以key结尾的所有分组的人数,value是小根堆
int ans = N;

int main()
{
    cin >> n;

    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);

    for(int i = 1; i <= n; i++)
    {
        if(mp[a[i] - 1].size()) //如果存在分组以a[i] - 1结尾
        {
            int cnt = mp[a[i] - 1].top(); //取以a[i] - 1结尾的分组的最小人数
            mp[a[i] - 1].pop();
            mp[a[i]].push(cnt + 1); //增加一个以a[i]结尾的分组,人数是cnt + 1
        }
        else //如果不存在以a[i] - 1结尾的分组
        {
            mp[a[i]].push(1); //增加一个以a[i]结尾的新分组人数
        }
    }

    for(pair<int, priority_queue<int, vector<int>, greater<int>> > p : mp)
    {
        if(p.second.size())
        {
            ans = min(ans, p.second.top());
        }
    }
    cout << ans;
    
    return 0;
}

 

标签:P4447,AHOI2018,int,洛谷题,最少,分组,mp,人数,结尾
From: https://www.cnblogs.com/jcwy/p/18034912

相关文章

  • 洛谷题单指南-贪心-P4995 跳跳!
    原题链接:https://www.luogu.com.cn/problem/P4995题意解读:消耗最大的体力跳完所有石头,贪心选择问题。解题思路:贪心策略:每次保证有最大的高度差即可,第一次跳到最大高度然后跳到最小高度,再跳到剩下的最大高度,再跳第二小高度,以此类推,直到跳完所有石头。100分代码:#include<bi......
  • 洛谷题单指南-贪心-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先选择价格大的一直到超过分组价格上限,再选择价格小的直到超过价格上限,此为一组重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格......
  • 洛谷题单指南-贪心-P1208 [USACO1.3] 混合牛奶 Mixing Milk
    原题链接:https://www.luogu.com.cn/problem/P1208题意解读:就是一个部分背包问题,贪心模版题。解题思路:优先选择单价低的牛奶即可。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=5005;structfarmer{intprice,count;}f[N];boolcmp(fa......
  • 洛谷题单指南-贪心-P5019 [NOIP2018 提高组] 铺设道路
    原题链接:https://www.luogu.com.cn/problem/P5019题意解读:最短时间内填满道路,连在一起的不为0的坑可以一起填解题思路:方法1:分治法对于一段连续不同深度的坑,可以最多连续填的天数是最小深度在填满最小深度之后,分别针对其左边和右边的区域再进行填充,这就是此题分治法的理论基......
  • 洛谷题单指南-贪心-P1478 陶陶摘苹果(升级版)
    原题链接:https://www.luogu.com.cn/problem/P1478题意解读:题目的本质是任务安排问题,有n件任务,每件任务耗时不同,在一定的时间内,如何安排任务使得完成的任务越多越好。解题思路:对于这类问题,贪心策略是优先完成容易的。回到摘苹果问题,要优先摘耗费力气小的,如果高度够不着,就跳过,......
  • 洛谷题单指南-贪心-P1106 删数问题
    原题链接:https://www.luogu.com.cn/problem/P1106题意解读:如何删数,让剩下的数最小,贪心选择问题。解题思路:先看样例:1754384第1次遍历:删掉7,剩下15438第2次遍历:删掉5,剩下1438第3次遍历:删掉4,剩下138第4次遍历:删掉8,剩下13,即为结果所以,贪心策略如下:1、遍历每一个数,如果前一......
  • 洛谷题单指南-贪心-P3817 小A的糖果
    原题链接:https://www.luogu.com.cn/problem/P3817题意分析:吃最少的糖果,保证相邻糖果数之和不大于x,需要某种贪心策略。解题思路:依次遍历相邻两盒糖果如果糖果数之和大于x,必须要吃点一部分,使得糖果数之和刚好等于x贪心策略是:优先吃后一盒糖果,因为这样可以更利于后续的判断成立......
  • 洛谷题单指南-贪心-P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
    原题链接:https://www.luogu.com.cn/problem/P1090题意解读:两两合并,是典型的哈夫曼编码算法思想,贪心即可。解题思路:要是合并体力消耗最少,就要让尽可能少的果子越晚合并越好,因此,贪心策略为优先选择数量最少的两堆果子合并,一直到剩下一堆果子,把合并过程中的消耗值累加即可,要快速......
  • 洛谷题单指南-贪心-P1803 凌乱的yyy / 线段覆盖
    原题链接:https://www.luogu.com.cn/problem/P1803题意解读:通过某种贪心策略,使得能参加的比赛数越多越好。解题思路:将比赛按照结束时间由小到大哦排序,贪心策略是优先选择结束时间早的比赛,因为这样能保证后面参加更多其他比赛100分代码:#include<bits/stdc++.h>usingnamespa......
  • 洛谷题单指南-贪心-P1223 排队接水
    原题链接:https://www.luogu.com.cn/problem/P1223题意解读:第i个人接水时,后面的n-i个人就要等待,要使平均等待时间最短,即总等待时间最短,贪心法解题。解题思路:设一共n个人,第i人的接水时间为ti总等待时间为:t1*(n-1)+t2*(n-2)+...+tn直观上,贪心策略应该是让接水时间短的人在前,后面......