数字出现次数与复杂度相关例题,出现次数与和的转化
https://ac.nowcoder.com/acm/contest/43844/F
- 暴力去求的复杂度为n^n
- 如果序列a的个数为lengtha,序列b的个数为lengthb,序列a的数字全为numa,序列a的数字全为numb,那么lengtha即为numa出现的次数,lengthb即为numb出现的次数,则答案为
- 观察数字出现的个数,考虑极端的情况,每个数字都只出现一次,出现的次数要尽可能多,那么就是一个从0开始,公差为1的等差数列。
- 说明一个序列中数字的种类最多为sqrt(2e7).
- 扫一遍两个序列,把每个序列中数字出现的次数存储下来,最后暴力求出答案,复杂的为O(2e7),可以承受
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int ar[3000010];
int br[3000010];
vector<pair<int,int>> ap,bp;
int main(){
int n;
int num;
cin>>n;
memset(ar,0,sizeof(ar));
memset(br,0,sizeof(br));
for(int i = 1;i<=n;i++) {
cin>>num;
ar[num]++;
}
for(int i = 1;i<=n;i++) {
cin>>num;
br[num]++;
}
// cout<<1<<endl;
for(int i = 0;i<=3000000;i++){
if(ar[i]) ap.push_back({i,ar[i]});
}
for(int i = 0;i<=3000000;i++){
if(br[i]) bp.push_back({i,br[i]});
}
// cout<<ap.size()<<endl;
long long ans = 0;
for(auto pa:ap){
for(auto pb:bp){
ans += (long long)pa.second*(long long)pb.second*floor(sqrt(abs(pa.first-pb.first)));
}
}
cout<<ans<<endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】