zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    python_深浅拷贝
    Python_三级菜单
    python 字符串
    python_字典
    初识Python
    C# ADO.NET面向对象想法
    C# ADO.NET
    C# ADO.NET 面向对象
    C# 数据库连接增删改查
    C# 面向对象多态的抽象性&接口 object&is as类型转换运算符
  • 原文地址:https://www.cnblogs.com/fusiwei/p/14012607.html
Copyright © 2011-2022 走看看