您的位置:首页 > Web前端

贪心法-Fence Repair POJ - 3253

2017-07-02 20:55 344 查看


为了保证开销最少,每次切割采用贪心原则,找最小的两块视为相邻的两块,再递归求解

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;//由于长度最多为50000,个数最多为20000,所以最后的开销可能会爆int
int a[20010];
int main()
{
int n;
ll ans;
cin>>n;
ans = 0;
for(int i = 0; i < n; i++)
cin>>a[i];
while(n > 1)
{
int mi1 = 0;
int mi2 = 1;
if(a[mi1] > a[mi2])swap(mi1,mi2);//注意是交换脚标
for(int i = 2; i < n; i++)
{
if(a[i] < a[mi1])
{
mi2 = mi1;
mi1 = i;
}
else if(a[i] < a[mi2])
mi2 = i;
}
int t = a[mi1] + a[mi2];
ans += t;
/*把和放到a[mi1]里,由于两部分合上之后会减少一部分,最后的一部分会消失,所以需要将那部分放到a[mi2]里。
如果mi1恰好是最后一个脚标,那么即使它不存在也没有关系,但是需要把和存在a[mi1]里所以将mi1与mi2调换一下,
如果mi2是最后一个由于不存放和所以即使没有也无关紧要*/
if(mi1 == n - 1)swap(mi1,mi2);
a[mi1] = t;
a[mi2] = a[n - 1];
n--;
}
cout<<ans<<endl;
return 0;
}

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