您的位置:首页 > 其它

51Nod-1414-冰雕

2016-08-13 02:15 288 查看
ACM模版

描述



题解

一开始高估了这道题难度,一直在想从中发现规律( ̄┰ ̄*),结果,╮(╯_╰)╭,只好暴力解之……还真的过了,这里给出一种一般的暴力解法和一种略微优化的暴力解题思路。

代码

One:

//  常规暴力解法
#include <iostream>
#include <cstdio>

using namespace std;

const int MAXN = 2e4 + 10;

int T[MAXN];

int main(int argc, const char * argv[])
{
int n;

while (cin >> n)
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", T + i);
sum += T[i];
}
int ans = sum;
for (int i = 3; i <= n / 2; i++)
{
if (n % i)
{
continue;
}
int key = n / i;
for (int j = 1; j <= key; j++)
{
sum = 0;
for (int k = j; k <= n; k += key)
{
sum += T[k];
}
if (sum > ans)
{
ans = sum;
}
}
}
cout << ans << '\n';
}

return 0;
}


Two:

//  略微优化解法
#include <stdio.h>

#define MAXN 20000
#define INF 0x3f3f3f3f
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int n;
int a[MAXN * 2];

int calc(int cnt, int step)
{
int ans = -INF;
int tmp;
for (int i = 0; i < step; ++i)
{
tmp = 0;
for (int j = 0; j < n; j += step)
{
tmp += a[i + j];
}
ans = MAX(ans, tmp);
}
return ans;
}

int main()
{
int i, x, y;
int ans = -INF;
int tmp;
scanf("%d", &n);
for (i = 0; i < n; ++i)
{
scanf("%d", a + i);
a[i + n] = a[i];
}
for (x = 1; x * x <= n; ++x)
{
if (n % x)  //  不能x等分或者n/x等分
{
continue;
}
y = n / x;
if (x >= 3) //  x等分
{
tmp = calc(x, y);
ans = MAX(ans, tmp);
}
if (y >= 3) //  y等分
{
tmp = calc(y, x);
ans = MAX(ans, tmp);
}
}

printf( "%d\n", ans );

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  暴力