程序设计实践课

来源:互联网 发布:数据侠客行 下载 编辑:程序博客网 时间:2024/05/24 06:13

今天的程序设计实践课,一佳学长现场演示了上次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;}

PS:又是件奇特的事,我照着1+学长抄的代码竟然在statistic里排第一,哈哈哈。。。
PS2:这个选修课我本来没有选,完全是蹭课去了,貌似我选的选修课都木有去听,类似于书非借不能读也。。。。