3.30今日题目
第一题
来人,上链接!
codeforce. Equalize the Array 1500
这道题的算法标签是–数据结构 / 贪心 / 二进制搜索(二分)
历程:
在我对map还不那么熟悉的时候,我用的是容器加排序加二分加映射,没错很痛苦,而且第一次的时候我写到后面看着我vs上复杂冗长的代码陷入了沉思,因为我自己快搞不清楚自己的代码了(附图)(笑过就算)
我到后面思路就乱掉了,大家也看到了我就没有做出来了。
而后我学完了map,发现新大陆了!!发现一一对应关系可以直接统计出每个数的个数,而且不用浪费多余的空间,而且还自动排序,于是用map写了前面两张图片实现的功能,而后到了最后一步记录操作次数的时候,又有了点点困难,发现要减去的数不好算,看了题解之后…不禁感叹,妙啊
是以一个数的个数为基准,个数大于这个数的数要将个数减少到基准数的个数,小于的数直接丢弃,于是有了先将小于的数的总个数算出(对应left),而后算出后面要删去的书(与right-nowcntw.second对应)*
下面是代码:
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int N=1e5;
int t, n, m;
int res;
int main()
{
cin>>t;
while (t--)
{
cin>>n;
map<int,int>alls;
for (int i=1;i<=n;i++)
{
cin>>m;
++alls[m];
}
map<int,int>groupcnt;
for (const auto &w:alls)
{
++groupcnt[w.second];
}
res=n;
int left=0,right=n,nowcnt=alls.size();
for (const auto &w:groupcnt)
{
res=min(res,left+right-nowcnt*w.first);
left+=w.first*w.second;
right-=w.first*w.second;
nowcnt-=w.second;
}
cout<<res<<endl;
}
return 0;
}
完美,今日的一题就奉献给codeforce了(简短太多了…,数据结构果然重要死了)