CF903C Boxes Packing

CF903C Boxes Packing

洛谷传送门

题意翻译

题目描述

Mishka有nnn个空盒子,对于每一个i(1≤i≤n)i(1 le i le n)i(1≤i≤n),第iii个盒子是一个边长为aia_iai的正方体。

如果满足以下条件,Mishka可以将盒子iii放入另一个盒子jjj中:

  • 第iii个盒子没有放进另一个盒子里;
  • 第jjj个盒子不包含任何其他盒子;
  • 第iii个盒子比第jjj个盒子小(ai<aj)(a_i<a_j )(ai<aj)。

Mishka可以将盒子互相放置任意次数。 他希望尽可能减少可以看见的盒子的数量。 如果一个盒子没有被放入另一个盒子中,则该盒子为可见的。

现请你帮助Mishka确定可见的盒子的最小可能数量。

输入格式

第一行包含一个整数n(1≤n≤5000)n(1 le n le 5000)n(1≤n≤5000),表示Mishka有的空盒子数量。

第二行包含nnn个整数a1a_1a1,a2a_2a2,.........,an(1≤ai≤109)a_n(1 le a_i le 10^9)an(1≤ai≤109),aia_iai表示第iii个盒子的边长。

输出格式

输出可见的盒子的最小可能数量。


题解:

套娃问题。

归纳一下题意,是求最少的严格上升序列使得这些序列覆盖整个原数列。

先排序,发现只有相同的数才会对答案造成影响。否则都可以一层一层套进去。

显然地,如果有若干块相同的数,答案就应该是最大的那块。

所以就代码显然了:

排序用的multiset,就喜欢STL。

#include<bits/stdc++.h>
using namespace std;
int n,ans=1,sum=1;
multiset<int> s;
multiset<int>::iterator it;
int main()
{
    scanf("%d",&n);
    s.insert(-1);
    for(int i=1;i<=n;i++)
    {
        int tmp;
        scanf("%d",&tmp);
        s.insert(tmp);
    }
    it=s.begin();
    multiset<int>::iterator it2=it;
    it++;
    for(;it!=s.end();it++,it2++)
    {
        if(*it2==*it)
        {
            sum++;
            ans=max(ans,sum);
        }
        else 
            sum=1;
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/14012607.html