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\n",ans);
return 0;
}