题目描述

给定n个选手,将他们分成若干只队伍。其中第i个选手要求自己所属的队伍的人数大等于a[i]人。

在满足所有选手的要求的前提下,最大化队伍的总数。

注:每个选手属于且仅属于一支队伍。

输入输出格式

输入格式:

第一行一个整数n,表示人数。

以下n行,每行一个整数表示a[i]。

输出格式:

输出队伍总数的最大值。数据保证有解。

输入输出样例

输入样例#1: 复制

5
2
1
2
2
3
输出样例#1: 复制

2

题意:中文题就不说了

题解:刚开始我想的是贪心,先让序列从小到大排序,因为至少要用a[i]个人,所以我秉承着越少越好的原则,从a[i]大的下手,把a[i]大的先填满,最后如果剩下的人数不足以满足,他们的a[i]那就把他们加到其他队伍中去。

但是有个致命的缺点,举例说明:

这里只写出来a[i]值:

1  1   1   3   3   1   1   1

这种情况如果我们从大考虑,把两个三都分别用1 1 3来凑齐,剩下的自己一组,那么队伍数就会少于把3 3 1凑在一起剩下的自己一组,因此我们还需要在中间判断这个a[i]要不要和之前比它大的一组,还是另外开一组

所以就有了现在的方法:

还让a[i]从小到大排序,这一次从a[i]小的下手,如果a[i]所需要的人数大于这个i,那么之前的全部加起来就没有办法凑成一个队伍满足要求,所以让dp值不变仍然为0。往后面找,如果找到一个i-a[i]大于0的,那就判断

1、如果这个i-a[i]==0,那就可以让dp[i]=dp[i-a[i]]+1

2、如果这个大于0,因为题目上要求每个人必须属于一个队伍,所以你找的这个dp[i-d[i]]必须大于0,大于0说明它包含了之前的比他a[i]值小的a[i],这样就符合了题意

而且为了找到最优解,它还要去看一下它的上一个(即dp[i-a[i]-1])是否满足要求(一般都要满足越往后面找后面的一定要比前面的尽量更优)

就只能讲成这样了<_>

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1000005;
7 int v[maxn],dp[maxn];
8 int main()
9 {
10 int n;
11 scanf("%d",&n);
12 for(int i=1;i<=n;++i)
13 {
14 scanf("%d",&v[i]);
15 }
16 sort(v+1,v+1+n);
17 for(int i=1;i<=n;++i)
18 {
19 if(i-v[i]-1>0 && dp[i-v[i]]>0 && dp[i-v[i]-1]>0 || i-v[i]==0 || i-v[i]-1==0)
20 dp[i]=max(dp[i-v[i]]+1,dp[i-v[i]-1]+1);
21 else if(i-v[i]>0 && dp[i-v[i]]>0 || i-v[i]==0)
22 dp[i]=dp[i-v[i]]+1;
23 else dp[i]=0;
24 }
25 printf("%d\n",dp[n]);
26 }

P2062 分队问题(DP)的更多相关文章

  1. 洛谷P2062 分队问题(dp)

    题意 题目链接 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. So ...

  2. P2062 分队问题(贪心orDP)

    题目描述 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. 输入输出格 ...

  3. 洛谷 P2062 分队问题

    这题太毒了....一开始就是死活想不到,结果看了很多遍题解,重新做的时候还是做不出来.. 好像有一点被错误的题解误导了? #include<cstdio> #include<algo ...

  4. 洛谷P2062 分队问题

      这是一道普及/提高- 然后你懂的,贪心扫一遍就可以了. 不懂提交人数那么少. //Serene #include<algorithm> #include<iostream> ...

  5. 动态规划dp专题练习

    貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3 ...

  6. 第十六届浙江大学宁波理工学院程序设计大赛 D 雷顿女士与分队hard version(dp)

    题意 链接:https://ac.nowcoder.com/acm/contest/2995/D来源:牛客网 卡特莉接到来自某程序设计竞赛集训队的邀请,来为他们进行分队规划. 现在集训队共有n名选手, ...

  7. FJNU Fang G and his Friends(状压DP)题解

    Description     众所周知,fang G 有很多小伙伴,有一天,Fang G 打算带他们去玩有趣的游戏OOXX,这个游戏需要分成两组,有趣的是,每个人互相之间都有一个满意度,大家都想和自 ...

  8. P2577 [ZJOI2005]午餐 状压DP

    题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...

  9. dp专题练习

    顺便开另外一篇放一些学过的各种dp dp总结:https://www.cnblogs.com/henry-1202/p/9194066.html 开坑先放15道题,后面慢慢补 目标50道题啦~~,目前 ...

随机推荐

  1. Typora笔记上传到播客时图片不显示问题解决(已解决)

    前言: ​ 相信我们都遇到过,使用Typora做笔记是一件非常令人舒服的事,然而,它却有一个非常难受的地方,那就是我们在做完笔记想要将其上传到自己的博客时,复制粘贴的图片无法显示.因为Typora复制 ...

  2. 日常采坑:.NetCore上传大文件

    一..NetCore上传大文件 .NetCore3.1 webapi 本地测试上传时,遇到一个坑,大点的文件直接失败,根本不走控制器方法. 二.大文件上传配置 IFormFile方式,vs IIS E ...

  3. 简要MR与Spark在Shuffle区别

    一.区别 ①本质上相同,都是把Map端数据分类处理后交由Reduce的过程. ②数据流有所区别,MR按map, spill, merge, shuffle, sort, r educe等各阶段逐一实现 ...

  4. MySQL常用的一些(就几个)聚合函数

    聚合函数 (常用) 函数名称 描述 CONUT() 记数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 -- ================= 聚合函数 ====== ...

  5. 【Software Test】Introduction to Software Testing

    Introduction to Software Testing 文章目录 Going to Learn --. Evolution of The Software Industry Errors, ...

  6. 【MySQL】Last_SQL_Errno: 1594Relay log read failure: Could not parse relay log event entry...问题总结处理

    备库报错: Last_SQL_Errno: 1594 Last_SQL_Error: Relay log read failure: Could not parse relay log event e ...

  7. 【Oracle】查看表空间是否为自动扩展

    查看指定的表空间是否为自动扩展 SQL>   select file_name,autoextensible,increment_by from dba_data_files where tab ...

  8. leetcode 321. 拼接最大数(单调栈,分治,贪心)

    题目链接 https://leetcode-cn.com/problems/create-maximum-number/ 思路: 心都写碎了.... 也许就是不适合吧.... 你是个好人... cla ...

  9. C语言目的概念(C语言学习笔记)

    什么是目 目是针对操作符来说的,一个操作符影响两个操作数就表示该操作符为双目运算符 举个例子: 1+2 这里的加号影响了1和2两个操作数,所以"+"就是双目运算符 +1,-1 这里 ...

  10. 关于BAPI_GOODSMVT_CREATE中货物移动相关事务代码说明

    BAPI_GOODSMVT_CREATE参数 goodsmvt_code中的GM_CODE是为 BAPI 货物移动分配事务代码 其取值为下面对应的事务代码: 01 MB0102 MB3103 MB1A ...