码迷,mamicode.com
首页 > 其他好文 > 详细

21.6.24 t2

时间:2021-06-24 18:37:45      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:include   void   cpp   c++   false   continue   std   code   enum   

tag:贪心


首先选择 \([n+1,2n]\),然后倒叙枚举 \(n\to1\),对于每个数 \(i\),如果 \(i\) 的所有倍数中,只有 \(1\) 个被选中了,那么就可以用 \(i\) 去替换那个倍数。


#include<bits/stdc++.h>
using namespace std;
  
template<typename T>
inline void Read(T &n){
    char ch; bool flag=false;
    while(!isdigit(ch=getchar()))if(ch==‘-‘)flag=true;
    for(n=ch^48;isdigit(ch=getchar());n=(n<<1)+(n<<3)+(ch^48));
    if(flag)n=-n;
}
 
enum{
    MAXN = 500005
};
 
int n;
 
char vis[MAXN<<1];
 
int main(){
    Read(n); n<<=1;
    long long ans=0;
    for(int i=n/2+1; i<=n; i++) ans += i, vis[i] = true;
    for(int i=n/2; i; i--){
        int id = -1;
        for(int j=i+i; j<=n; j+=i)
            if(vis[j]){
                if(id==-1) id = j;
                else{id = -1; break;}
            }
        if(id==-1) continue;
        ans -= id; ans += i;
        vis[id] = false; vis[i] = true;
    }
    cout<<ans<<‘\n‘;
    return 0;
}

21.6.24 t2

标签:include   void   cpp   c++   false   continue   std   code   enum   

原文地址:https://www.cnblogs.com/oisdoaiu/p/14927285.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!