题解:P10355 [PA2024] Znaczki pocztowe

封面

思路:

规律:观察后发现答案是每种邮票的张数除以现在的人数后省去小数部分后再次乘以人数。

每种邮票的张数除以现在的人数后省去小数部分就是可以分成几组,组不能是小数,因为题中说申请人都必须从该城市获得相同数量的邮票所以不能分开。

再乘以人数就是求分出了几张邮票。

一开始想用桶但发现数据太大了开不了数组,所以用了 map 但是用了 map 后发现不能满分于是观察了下发现只要有一个的邮票发出总和为零时,后面的也都是零,这样过后发现还是不可以满分,再次观察题目发现是不需要排序的,所以把 map 改成 unordered_map 就这样了吗,没有,再次观察可以发现当一个邮票的张数已经小于现在的人数了,那么不管怎么样,后面都不可以让答案增加了,所以直接删去,这样就可以了。

代码:

#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int>mp;
int n;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
int a;cin>>a;
mp[a]++;
}
bool s0=0;// 特判 0
for(int i=1;i<=n;i++){
long long sum=0;
if(s0){// 特判 0
cout<<"0 ";continue;
}
auto it=mp.begin();
while(it!=mp.end()){
sum+=(it->second)/i*i;
if((it->second)<i)mp.erase((it++));// 直接删去
else it++;
}
cout<<sum<<" ";
if(sum==0)s0=1;// 特判 0
}
return 0;
}