H-无尽大军 2019年安徽大学ACM/ICPC实验室新生赛(公开赛)

一道简单的递推题目。基于贪心的思想,要想花费少,应该尽可能采用翻倍再的方法,比如100的话先构造出50,再翻倍,99的话,构造出33,翻倍再一次。因此对n来说,找到它最小的质因子i,n/i就是构造n之前需要构造的军队。(题目数据范围也隐性提示了一下做法)。
个人习惯用dfs写这类问题。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n;
ll dfs(ll n) /**< 贪心思想 */
{
    if(n==1)
        return 0;
    ll i;
    for(i=2; i*i<=n; i++)/**< 找到n最小质因子 */
    {
        if(n%i==0)
            break;
    }
    if(i*i<=n)
        return i+dfs(n/i);/**< 花费正好是质因子的值,总共***i-1次,第一次花费2 */
    else
        return n;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j;
    cin>>n;
    cout<<dfs(n);
    return 0;
}
全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务