zoukankan      html  css  js  c++  java
  • P2062 分队问题(DP)

    题目描述

    给定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
    ",dp[n]);
    26 }
    View Code
  • 相关阅读:
    filter函数示例
    组件里v-for示例
    操作数组的函数简介
    class绑定对象改进版
    python 全栈开发,Day6(函数进阶)
    python 全栈开发,Day5(函数初识)
    python 全栈开发,Day4(文件操作)
    python 全栈开发,Day3(集合,深浅copy)
    python 全栈开发,Day2(基础数据类型)
    python 全栈开发,Day1(python介绍,变量,if,while)
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11014763.html
Copyright © 2011-2022 走看看