poj 3253 Fence Repair
/** poj 3253 Fence Repair * 05.06/2014 */ #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 30000 using namespace std; int N; int a[MAXN]; void solve() { long long ans = 0; while(N -1) { int min1=0,min2=1; if(a[min1] > a[min2]) swap(min1,min2); for(int i = 2; i < N; i++) { if(a[i] < a[min1]) { min2 = min1; min1 = i; } else if(a[i] < a[min2]) { min2 = i; } } int temp = a[min1] + a[min2]; ans += temp; if(min1 == N-1) { a[min2] = temp; } else if(min2 == N-1) { a[min1] = temp; } else { a[min1] = temp; a[min2] = a[N-1]; } N--; } printf("%lld\n",ans); return; } int main() { scanf("%d",&N); for(int i = 0; i < N; i++) scanf("%d",&a[i]); solve(); return 0; }
题目:
找使得耗费最小的切割板材的方法。
分析:
一开始切大块,后面切小块。因为每块被算进耗费的次数是和它被切的次数一致的。参见霍夫曼编码。
心得:
int 32 约4*10^9,而数据范围2*10^4和5*10^4并不是简单的相乘