P2062 分队问题(DP)
题目描述
给定n个选手,将他们分成若干只队伍。其中第i个选手要求自己所属的队伍的人数大等于a[i]人。
在满足所有选手的要求的前提下,最大化队伍的总数。
注:每个选手属于且仅属于一支队伍。
输入输出格式
输入格式:
第一行一个整数n,表示人数。
以下n行,每行一个整数表示a[i]。
输出格式:
输出队伍总数的最大值。数据保证有解。
输入输出样例
题意:中文题就不说了
题解:刚开始我想的是贪心,先让序列从小到大排序,因为至少要用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)的更多相关文章
- 洛谷P2062 分队问题(dp)
题意 题目链接 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. So ...
- P2062 分队问题(贪心orDP)
题目描述 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. 输入输出格 ...
- 洛谷 P2062 分队问题
这题太毒了....一开始就是死活想不到,结果看了很多遍题解,重新做的时候还是做不出来.. 好像有一点被错误的题解误导了? #include<cstdio> #include<algo ...
- 洛谷P2062 分队问题
这是一道普及/提高- 然后你懂的,贪心扫一遍就可以了. 不懂提交人数那么少. //Serene #include<algorithm> #include<iostream> ...
- 动态规划dp专题练习
貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3 ...
- 第十六届浙江大学宁波理工学院程序设计大赛 D 雷顿女士与分队hard version(dp)
题意 链接:https://ac.nowcoder.com/acm/contest/2995/D来源:牛客网 卡特莉接到来自某程序设计竞赛集训队的邀请,来为他们进行分队规划. 现在集训队共有n名选手, ...
- FJNU Fang G and his Friends(状压DP)题解
Description 众所周知,fang G 有很多小伙伴,有一天,Fang G 打算带他们去玩有趣的游戏OOXX,这个游戏需要分成两组,有趣的是,每个人互相之间都有一个满意度,大家都想和自 ...
- P2577 [ZJOI2005]午餐 状压DP
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- dp专题练习
顺便开另外一篇放一些学过的各种dp dp总结:https://www.cnblogs.com/henry-1202/p/9194066.html 开坑先放15道题,后面慢慢补 目标50道题啦~~,目前 ...
随机推荐
- 剑指offer 面试题9:用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移 ...
- Java基础概念性问题整理,面试题型整理,附带答案详解供参考,首次整理!
题目目录 Java基础 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建对象的几种方式 7. ...
- Jenkins上实现Python + Jenkins + Allure Report 接口自动化测试持续集成,最终测试报告用allure-report进行展示
项目介绍 接口功能测试应用:http://www.weather.com.cn/data/cityinfo/<city_code>.html 测试功能:获取对应城市的天气预报 源码:Pyt ...
- wpf 中 Ellipse 对象对动画性能的影响
vs2019 .NetFramework 4.8 win10-64 1909 接手一个wpf项目,某窗口中包含大量的 Shape 对象(线,矩形,圆形等). 这些内容要匀速的向左平移,类似于游戏&qu ...
- egret 解决游戏loading前的黑屏
一.问题 egret游戏loading界面的制作可以参考这个,我就不多赘述啦,步骤也比较详细<Egret制作Loading页面及分步加载资源教程>. 后面我发现即便加上loading,在游 ...
- 浅入深出了解XXE漏洞
环境搭建 https://github.com/c0ny1/xxe-lab 为了更深入的理解,我准备理论和实际相结合的了解XXE! 浅谈XML 初识XML 一个好的代码基础能帮助你更好理解一类漏洞,所 ...
- 判断最长回文串——暴力、延展、Manacher
1. 暴力 时间复杂度O(n^3). 2. 延展 以某一字符为中心,设置left, right两个变量同时向外扩,判断他们指向字符是否相同.注意分奇偶讨论.时间复杂度O(n^2). 3. Manach ...
- uni-app开发经验分享十二: Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息
Android平台从6.0(API23)开始系统对权限的管理更加严格,所有涉及敏感权限都需要用户授权允许才能获取.因此一些应用基础业务逻辑需要的权限会在应用启动时申请,并引导用户允许. 读写手机存储权 ...
- JavaScript中的迭代器和生成器[未排版]
JavaScript中的迭代器 在软件开发领域,"迭代"的意思是按照顺序反复多次执行一段程序,通常会有明确的终止条件. ECMAScript 6规范新增了两个高级特性:迭代器和生成 ...
- top命令详解-性能分析
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析. top命令说明 [www.linuxidc.com@linuxidc-t-tomcat-1 ...