Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
注意结果要用int64,就能过了。现公布代码如下:4643100 bjtu1 3253 Accepted 1304K 47MS C++ 1456B 2009-02-18 12:14:46 #include<stdio.h> #include<malloc.h> #include<queue> #include<vector> #define MAX 20001 using namespace std; __int64 min1; int weight[MAX]; typedef struct Node{ int w; int flag; int id; struct Node *left,*right; }Node; Node T[3*MAX]; struct cmp{ bool operator()(const Node &e1,const Node &e2){ return e1.w>e2.w; } }; priority_queue<Node,vector<Node>,cmp>heap; void huffman(Node T[MAX],int weight[MAX],int n){ int i; Node s1,s2; while(heap.size()) heap.pop(); for(i=0;i<n;i++){ T[i].w=weight[i]; T[i].flag=0; T[i].id=i; T[i].left=T[i].right=NULL; heap.push(T[i]); } for(;i<2*n-1;i++){ T[i].id=i; T[i].w=T[i].flag=0; T[i].left=T[i].right=NULL; } for(i=n;i<2*n-1;i++){ s1=heap.top(); heap.pop(); s2=heap.top(); heap.pop(); T[s1.id].flag=1; T[s2.id].flag=1; T[i].w=s1.w+s2.w; T[i].left=&T[s1.id]; T[i].right=&T[s2.id]; if(i!=2*n-2) heap.push(T[i]); } }; void Travel(Node *s,int i){ if(s==NULL) return; if(s->left==NULL&&s->right==NULL) min1+=(s->w+i); else{ Travel(s->left,i+1); Travel(s->right,i+1); } }; int main() { int i; int n; Node *p; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++) scanf("%d",&weight[i]); huffman(T,weight,n); for(i=0;i<2*n-1;i++) if(!T[i].flag) break; min1=0; p=&T[i]; Travel(p,0); printf("%I64d\n",min1); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator