1414 冰雕(思维+暴力)
Posted Veritas des Liberty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1414 冰雕(思维+暴力)相关的知识,希望对你有一定的参考价值。
收藏
关注
白兰大学正在准备庆祝成立256周年。特别任命副校长来准备校园的装扮。
校园的中心竖立着n个冰雕。这些雕像被排在一个等分圆上,因此他们形成了一个正n多边形。这些冰雕被顺针地从1到n编号。每一个雕有一个吸引力t[i].
校长来看了之后表示不满意,他想再去掉几个雕像,但是剩下的雕像必须满足以下条件:
· 剩下的雕像必须形成一个正多边形(点数必须在3到n之间,inclusive),
· 剩下的雕像的吸引力之和要最大化。
请写一个程序帮助校长来计算出最大的吸引力之和。如果不能满足上述要求,所有雕像不能被移除。
Input
单组测试数据。 第一行输入一个整数n(3≤n≤20000),表示初始的冰雕数目。 第二行有n个整数t[1],t[2],t[3],…,t[n],表示每一个冰雕的吸引力(-1000≤t[i]≤1000),两个整数之间用空格分开。
Output
输出答案占一行。
Input示例
8 1 2 -3 4 -5 5 2 3 6 1 -2 3 -4 5 -6
Output示例
14 9
System Message (题目提供者)
一道很水的题,但是第一次做花了很长时间,注意吸引力为负的情况
AC代码
#include<bits/stdc++.h> #include<cstdio> const int maxn = 20000 + 10; const int M = 0x3f3f3f; using namespace std; int n; int i,j,k,s; int a[maxn]; int b[maxn]; int ans,sum,num; int solve(int n) { k = 0; for(i=2; i+i<n; i++) { if(n/i < 3) break; if(n % i == 0) b[k] = i; k++; } return k; } int main() { while(scanf("%d",&n)!=EOF) { sum = 0; ans = 0; num = solve(n); for(i=0; i<n; i++) { scanf("%d",&a[i]); ans += a[i]; } for(i=0; i<=num; i++) { for(j=0; j<b[i]; j++) { sum = 0; for(k=j; k<n; k=k+b[i]) { if(b[i] == 0) { sum = ans; break; } sum += a[k]; } ans = max(ans,sum); } } printf("%d\n",ans); } return 0; }
以上是关于1414 冰雕(思维+暴力)的主要内容,如果未能解决你的问题,请参考以下文章