藍橋杯 算法提高 拿糖果


題目分析

簡單的dp,注意要構建素數表

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 100005;
int vis[1005];
int prime[1005];
int dp[maxn];

int init() //構建素數表
{
memset(vis,0,sizeof(vis));
int cnt = 0,len = sqrt(maxn) + 1;
for(int i = 2; i < len; i++)
if(!vis[i])
{
prime[cnt++] = i;
for(int j = i*i; j < len; j += i)
vis[j] = 1;
}
return cnt;
}

int main()
{
int n;
int cnt = init();
while(scanf("%d", &n) != EOF)
{
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < cnt; j++)
{
if(prime[j] > sqrt(i))
break;
else if(i%prime[j] == 0)
dp[i]=max(dp[i], dp[i-2*prime[j]]+prime[j]);
}
}
printf("%d\n", dp[n]);
}
return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com