今天的程序设计实践课,一佳学长现场演示了上次huffman的问题,写的是个简洁、飘逸啊,指针用的是个灵活。。。同步敲的代码如下,由于一些地方没跟上,所以可能略有些不同:
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; const int N = 10050; struct node{ int value; node *left,*right; bool operator< (const node b)const { return value < b.value; } }; node leaves[ N ], inner[ N ]; //名字起的很直白,一看就懂 int readString(){ //读入的处理,额,一般我习惯scanf %s这么处理。。。 int ret = 0; char ch; while( (ch = getchar()) !=' ' ) ret++; return ret - 1; } int preOrder( node *now, int depth ){ //将树遍历一遍,求出答案 if( now == NULL ) return 0; else { if( now -> left == NULL && now -> right ==NULL ) { return depth * now -> value; } else { return preOrder( now -> right, depth + 1) + preOrder( now -> left, depth + 1); } } } int main() { int n; while( scanf( "%d", &n ) == 1){ int ans1 = 0; for( int i = 0; i < n; i ++){ int len = readString(); scanf( "%d", &leaves[ i ].value); leaves[ i ].left = NULL; leaves[ i ].right = NULL; ans1 = ans1 + len * leaves[ i ].value; } if( n == 1 ) { printf( "%d %d\n", ans1,leaves[ 0 ].value); continue; } sort( leaves , leaves + n); int now = 0, head = 0, tail = 0; for( int i = 1; i < n; i++){ node *minValue, *secMinValue; if( head == tail || (now < n && leaves[ now ] < inner[ head ] )) { minValue = leaves + now; now ++; } else { minValue = inner + head; head ++; } if( head == tail || (now < n && leaves[ now ] < inner[ head ] )) { secMinValue = leaves + now; now ++; } else { secMinValue = inner + head; head ++; } inner[ tail ].value = minValue -> value + secMinValue -> value; inner[ tail ].left = minValue; inner[ tail ].right = secMinValue; tail ++; } node * root = inner + head; printf("%d %d\n",ans1, preOrder( root, 0)); } return 0; }
然后呢,我又模仿这个样子,写了stoneI,虽然题很水,但是模仿着1+学长写的很是有条有理,哈哈,贴代码:
#include <iostream> using namespace std; const int N = 100010; int a[N],b[N]; int main() { int t; scanf("%d",&t); while(t--) { int n,ans=0,i; scanf("%d",&n); for(i=0;i<n ;i++) scanf("%d",a+i); sort(a,a+n); int now = 0, head = 0, tail = 0, minVal, secMinVal; for(i = 0; i < n - 1; i ++) { if( head == tail || ( now < n && a[ now ]< b[ head ])) { minVal = a[ now ]; now ++; } else { minVal = b[ head ]; head++; } if( head == tail || ( now < n && a[ now ]< b[ head ])) { secMinVal = a[ now ]; now ++; } else { secMinVal = b[ head ]; head++; } b[ tail++ ] = minVal + secMinVal; ans += minVal + secMinVal; } printf("%d\n",ans); } return 0; }