P2062 分队问题(贪心orDP)
题目描述
给定n个选手,将他们分成若干只队伍。其中第i个选手要求自己所属的队伍的人数大等于a[i]人。
在满足所有选手的要求的前提下,最大化队伍的总数。
注:每个选手属于且仅属于一支队伍。
输入输出格式
输入格式:
第一行一个整数n,表示人数。
以下n行,每行一个整数表示a[i]。
输出格式:
输出队伍总数的最大值。数据保证有解。
输入输出样例
5
2
1
2
2
3
2
分析:(贪心)
贪心的思想就是尽量将要求大的人放在一起。所以我们要先排个序,从大到小,然后用一个now表示当前队列还需多少个人可以满足条件 初始代码:
now=a[1];
for (int i=1;i<=n;i++)
{
now--;
if (!now)
{
now=a[i];
s++;
w=false;
}
}
然后我们可以发现:
8
1 2 4 5 5 5 5 5
这一组数据中我们会将4归入第二个队列,导致第二个队列不成立,所以我们需要进行优化该情况。如果我们发现将目前在队列里的的归入前一个队列会更优的话我们就可以直接改变now
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[],now,s,maxs;
bool w;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
sort(a+,a++n,cmp);
w=true;//表示是否是第一个队列,如果是就不可以归入前一个队列了
now=a[];//从第一个开始
for (int i=;i<=n;i++)
{
if (a[i]<now&&!w)//比较
{
now=a[i];
}
now--;
if (!now)//一个队列已经满足要求
{
now=a[i];
s++;
w=false;
}
}
printf("%d",s);
}
(DP)
设 f[i]f[i] 表示前i个人能够分成的最大的队伍个数
从小到大排序一遍之后,显然可以发现,当第i个人可以加入这个队伍时,当且仅当 i>=a[i]i>=a[i]
所以可以得到一个转移方程: f[i]=max(f[k])+1(0<i<=a[i])f[i]=max(f[k])+1(0<i<=a[i])
但是这样对于百万级别的n是会超时的
考虑怎么去优化它
我们可以开一个数组来储存 f[1...n]f[1...n] 的最大值
则转移方程可以改成: f[i]=g[i-a[i]]+1f[i]=g[i−a[i]]+1
对于g数组的维护: g[i]=max(g[i-1],f[i])g[i]=max(g[i−1],f[i])
这样就可以完成O(n)转移
#include<bits/stdc++.h>
using namespace std;
int a[];
int f[];
int s[];
int main( )
{
int n;
scanf("%d",&n);
for(int i= ; i<=n ; i++)
scanf("%d",&a[i]);
sort(a+,a+n+);
for(int i= ; i<=n ; i ++)
{
if(i>=a[i])
f[i]=s[i-a[i]]+;
else
f[i]=;
s[i]=max(f[i],s[i-]);
}
printf("%d\n",f[n]);
}
P2062 分队问题(贪心orDP)的更多相关文章
- 洛谷P2062 分队问题
这是一道普及/提高- 然后你懂的,贪心扫一遍就可以了. 不懂提交人数那么少. //Serene #include<algorithm> #include<iostream> ...
- P2062 分队问题(DP)
题目描述 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. 输入输出格 ...
- 洛谷P2062 分队问题(dp)
题意 题目链接 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. So ...
- 洛谷 P2062 分队问题
这题太毒了....一开始就是死活想不到,结果看了很多遍题解,重新做的时候还是做不出来.. 好像有一点被错误的题解误导了? #include<cstdio> #include<algo ...
- 动态规划dp专题练习
貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3 ...
- HihoCoder1653 : 公平分队([Offer收割]编程练习赛39)(贪心)
描述 小Hi和小Ho在玩一个战争游戏.游戏中2N个战斗单位,其中第i个单位的战斗力是Ai. 现在小Hi和小Ho要各选N个单位组成队伍,当然他们都希望自己队伍的总战斗力越大越好. 为了使分队更加公平,经 ...
- [ZJOI2005]午餐 (贪心,动态规划)
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- Luogu2577 | [ZJOI2005]午餐 (贪心+DP)
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
随机推荐
- 一:ORM关系对象映射(Object Relational Mapping,简称ORM)
狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...
- python【事物 】【数据库锁】
1.数据库事物 1. 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一 ...
- 客户端调用服务器端方法——ASP.NET AJAX(Atlas)、Anthem.NET和Ajax.NET Professional实现之小小比较
前几天曾经发过一篇<ASP.NET AJAX(Atlas)和Anthem.NET——管中窥豹般小小比较>,Jeffrey Zhao说用ASP.NET AJAX中的UpdatePanel似乎 ...
- JS性能之滚动条之外的其他部分
问题: 如果一个页面宽高比较大,也就是页面需要滚动条来查看其他页面内容,这时候,在滚动条之外的其他部分,是依然处于运行状态. 比如那部分有视频播放,则那些视频虽然在当前窗口看不到,但它们还是会处于播放 ...
- ss1
首先,对系统来一次升级,以解决一些莫名其妙的依赖问题. sudo yum update 然后安装Python-pip. sudo yum -y install python-pip 注意,通过yum包 ...
- Centos6.5_64位系统下安装Oracle 11g
一.硬件要求 1.内存与Sweap:内存2G(以上),Sweap 2G(以上) 内存: 1-2G 2-16G 16G以上 Sweap: 1.5倍内存 1倍内存 16G 检查:# grep MemTot ...
- C基础题-sizeof
sizeof C语言中判断数据类型或者表达式长度符:关键字:字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来! 一.关于sizeof简单的总结 1.sizeof的使用形式:sizeo ...
- assert.fail()
assert.fail(message) assert.fail(actual, expected[, message[, operator[, stackStartFunction]]]) oper ...
- 面试题: !=!=未看12 略多 sql语句练习 非常 有用
JAVA面试总结 2015年03月25日 16:53:40 阅读数:4306 刚才看到的,先转载过来,没准以后用到…… 面试总结 2013年8月6日: 问题2:Hibernate的核心接口有哪些? ...
- hibernate hql 查询指定…
以数组的形式抛出,前台页面就要把它当成一个数组来处理 以对象抛出,就要当成一个对象来处理. 在JSP页面使用标签时一定要注意这点. 版权声明:本文为博主原创文章,未经博主允许不得转载.