51nod 1414 冰雕 思路:暴力模拟题
生活随笔
收集整理的這篇文章主要介紹了
51nod 1414 冰雕 思路:暴力模拟题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
題意是現在有n個雕像把一個圓等分了,每一個雕像有一個吸引力。
叫你不移動雕像只去掉雕像讓剩下的雕像還能等分這個圓,求剩下的雕像的吸引力之和的最大值。
顯然去掉后剩下雕像的間隔應該是n的因子,因為這樣才能使剩下的雕像等分圓。
這道題數據量不大,可以暴力枚舉,模擬出每一種情況取最大值就可以了。
現在我們分析完這道題了,寫一下步驟。
1.求出n的因子存在list中。
? for(int i = 1;i <= n/3; i++){ if(n% i == 0) l.push_back(i); }?
2.遍歷因子(因子是可以去取的間隔),遍歷從1到因子作為第一個取的雕像(因為是一個圓,間隔相等有多種情況)。
現在第一個雕像和間隔都確定了,只需要求和更新答案就好了。
int ans = -1000*20000;int sum;for(it = l.begin(); it != l.end(); it++){for(int j = 1;j <= *it; j++ ){sum = 0;for(int i = j;i <= n; i += *it){sum += a[i];}ans = max(ans,sum);}}cout << ans << endl;?
?
加點注釋,上上代碼
#include <bits\stdc++.h> using namespace std;int a[20005]; list <int> l; // 用來存 n的因子 list <int>::iterator it; int main(){int n;cin >> n;//求n的因子, n/3是題目要求不能少于3個 for(int i = 1;i <= n/3; i++){if(n% i == 0) l.push_back(i);} // for(it = l.begin();it != l.end(); it++){ // cout << *it << " " << endl; // }for(int i = 1;i <= n; i++){cin >> a[i];}int ans = -1000*20000; //可能的最小值。 int sum; //對某一種情況求和//遍歷因子,即為間隔 for(it = l.begin(); it != l.end(); it++){//遍歷確定第一個雕像的位置,不清楚的話畫個圖。 for(int j = 1;j <= *it; j++ ){sum = 0;//求和 for(int i = j;i <= n; i += *it){sum += a[i];}//更新答案 ans = max(ans,sum);}}cout << ans << endl;return 0; }?
總結
以上是生活随笔為你收集整理的51nod 1414 冰雕 思路:暴力模拟题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bmob云IM实现头像更换并存入Bmob
- 下一篇: 51nod 1270 数组的最大代价 思