poj 3253 Fence Repair

贪心,类似霍夫曼编码

每次找出 最短的两个plank合并并加入集合中, 总共需要合并N次,每一次查找最短plank需要O(N)。

参考了别人代码,对时间常数进行优化才能AC(记录位置并不交换)


/*
PROG: Fence Repair
LANG: C++11 
*/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <time.h>

using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))

typedef long long ll;
const int N = 100010;
const ll MOD = 1000000007;
const int INF = 0x7fffffff;

ll a[20002];

int main()
{
    clock_t t1 = clock();
    ll n, m, i, sum;
    cin >> n;
    sum = 0;
    for(i = 0; i < n; i++){
        scanf("%lld", &a[i]);
    }
    clock_t t2 = clock();
    int s = 0, temp = 0;
    int min1, min2; 
    while(s+1 < n){
        // find two shortest plank
        if(a[s] > a[s+1])
            swap(a[s], a[s+1]);
        min1 = s; min2 = s+1;
        for(i = s+2; i < n; i++){       // 记录序号并不交换
            if(a[i] < a[min1]){         // 优化了时间常数才AC
                min2 = min1;
                min1 = i;
            }
            else if(a[i] < a[min2]){
                min2 = i;
            }
        }
        int temp = a[min1] + a[min2];
        if(min2 == s) 
            swap(min1, min2);
        a[min1] = a[s];
        a[min2] = temp;
        sum += temp;
        s++;
    }
    cout << sum << endl;
    clock_t t3 = clock();

    //cout << "total time : " << (double)(t3-t1)/CLOCKS_PER_SEC << endl;
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值