zoukankan      html  css  js  c++  java
  • [Luogu 2062]分队问题

    Description

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

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

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

    Input

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

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

    Output

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

    Sample Input

    5
    2
    1
    2
    2
    3 

    Sample Output

    2

    Hint

    对于20%的数据,n <= 10

    对于40%的数据,n <= 1000

    对于60%的数据,n <= 10000

    对于100%的数据,1 <= n <= 10^6

    题解

     1 #include<set>
     2 #include<map>
     3 #include<cmath>
     4 #include<ctime>
     5 #include<queue>
     6 #include<stack>
     7 #include<vector>
     8 #include<cstdio>
     9 #include<string>
    10 #include<cstdlib>
    11 #include<cstring>
    12 #include<iostream>
    13 #include<algorithm>
    14 #define Max(a,b) ((a)>(b) ? (a):(b))
    15 using namespace std;
    16 const int N=1e6;
    17 
    18 int a[N+5],x,n;
    19 int sorted[N+5],pos;
    20 int f[N+5];
    21 int s[N+5];
    22 
    23 int main()
    24 {
    25     scanf("%d",&n);
    26     for (int i=1;i<=n;i++) scanf("%d",&x),a[x]++;
    27     for (int i=1;i<=n;i++) for (int j=1;j<=a[i];j++) sorted[++pos]=i;
    28     for (int i=1;i<=n;i++)
    29     {
    30         if (i>=sorted[i]) f[i]=1+s[i-sorted[i]];
    31         else f[i]=0;
    32         s[i]=Max(s[i-1],f[i]);
    33     }
    34     printf("%d
    ",f[n]);
    35     return 0;
    36 }
  • 相关阅读:
    EasyUI Datagrid换页不清出勾选方法
    【HDOJ】4902 Nice boat
    【HDOJ】1688 Sightseeing
    【HDOJ】3584 Cube
    【POJ】2155 Matrix
    【HDOJ】4109 Instrction Arrangement
    【HDOJ】3592 World Exhibition
    【POJ】2117 Electricity
    【HDOJ】4612 Warm up
    【HDOJ】2888 Check Corners
  • 原文地址:https://www.cnblogs.com/NaVi-Awson/p/7448343.html
Copyright © 2011-2022 走看看