Intelligent Warehouse(小米邀请赛)
生活随笔
收集整理的這篇文章主要介紹了
Intelligent Warehouse(小米邀请赛)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
題意:
n個數字,問存在的最長的一組數,使得其中任意兩個數的都是倍數關系,問最長的長度是多少
題解:
暴力。。。
沒想到暴力就能做,當時就該交上去試試的
用dp[i]表示當期選的所有數都是i的約數且符合題意的情況下所能選的個數的最大值
最直觀的轉移就是dp[i]取更新i的所有倍數的dp值
復雜度是O(WlogW),沒想到竟然不會tle。。。
正解:
只用枚舉i的素數倍數即可,因為合數總可以用若干個素數的乘積給湊出來
時間復雜度(O(W log log W))
代碼:
暴力:
//A #include <iostream> #include <cstdio> using namespace std; const int maxn=1e7+5;int n,a[200005],cnt[maxn],dp[maxn],ans,maxx;int main() {scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);maxx=max(maxx,a[i]);cnt[a[i]]++;}for(int i=1;i<maxn;i++){if(!cnt[i]) continue;dp[i]+=cnt[i];for(int j=i<<1;j<maxn;j+=i){if(cnt[j]) dp[j]=max(dp[i],dp[j]);}}for(int i=1;i<=maxx;i++) ans=max(ans,dp[i]);printf("%d\n",ans); }正解:
#include <bits/stdc++.h> typedef long long ll; using namespace std; const int N=100005; int mod=1e9+7; const int nn=1e7+5; int prime[nn],vis[nn],cnt; void eularsie(int n) {cnt=0;for(int i=2;i<=n;i++) {if(!vis[i]) {prime[cnt++]=i;}for(int j=0;j<cnt&&i*prime[j]<=n;j++) {if(!vis[i*prime[j]]) {vis[i*prime[j]]=1;}if(i%prime[j]==0) break;}} } int a[nn],dp[nn]; int main() {//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);eularsie(1e7);int n;cin>>n;for(int i=0;i<n;i++) {int x;cin>>x;a[x]++;}int ans=0;for(int i=1;i<=1e7;i++) {dp[i]+=a[i];ans=max(ans,dp[i]);for(int j=0;j<cnt&&i*prime[j]<=1e7;j++) {dp[i*prime[j]]=max(dp[i*prime[j]],dp[i]);}}cout<<ans<<'\n';return 0; } /**/總結
以上是生活随笔為你收集整理的Intelligent Warehouse(小米邀请赛)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cab是什么文件?
- 下一篇: 傻丫头字幕精灵使用教程