1790D
题意: n n n 个数,分成集合总数最小的几个集合,每个集合中数字连续
思路:贪心,从没有被选入集合中的最大数开始,不断选取比其小1的数。
优化:用map计数 模拟
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
void solve()
{
int n;
cin>>n;
vector<int> a(n+1);
for (int i=1;i<=n;i++)
cin>>a[i];
sort(a.begin()+1,a.end(),cmp);
map<int,int> sum;
vector<int> b;
for (int i=1;i<=n;i++)
{
if (b.empty()||b[b.size()-1]!=a[i])
b.push_back(a[i]);
sum[a[i]]++;
}
int ans=0;
for (auto i:b)
{
int now=sum[i],pos=i;
ans+=now;
while (now)
{
int minn=min(sum[pos-1],now);
sum[pos-1]-=minn;
pos--;
now=minn;
}
}
cout<<ans<<"\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while (t--)
{
solve();
}
return 0;
}