• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            付翔的專欄
            在鄙視中成長 記錄成長的點滴
            posts - 106,  comments - 32,  trackbacks - 0
            這次寫代碼基本也是一氣呵成 ,當然中間還是調試了才正確運行 ,可以通過北郵OJ 的測試 ,其邏輯和在圖書館寫在草稿的邏輯沒有多大改動,看來寫代碼之前
            做初步分析還是很重要的 , 
            http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1817 
            # include<stdio.h>
            # include<stdlib.h>
            # include<string.h>
            
            const int N = 2*1000+ 3 ;
            
            # define GetMax(a,b) ((a)>(b) ?(a) :(b) )
            struct TreeNode
            {
            	int data;
            	int left,right,father;
            	int deep;
            };
            
            struct TreeNode ArrayTree[N];
            int used[N];
            
            int cmp(const void * a,const void * b)
            {
            	return ((struct TreeNode * )a)->data - ((struct TreeNode * )b)->data;
            }
            void init()
            {
            	memset(ArrayTree,0,sizeof(ArrayTree));
            	memset(used,0,sizeof(used));
            	for(int i = 0 ; i < N; i ++)
            	{
            		ArrayTree[i].deep = 1;
            		ArrayTree[i].left = -1;
            		ArrayTree[i].right = -1;
            	}
            
            }
            
            /* 
            用一維數組模擬樹的建立  前面end 是排好序的節點 ,也就是之后建好樹的葉子節點
            以 0 -end -1 和 end - end2 -1  ,后面是編碼過程中形成的節點
            我認為 最小的節點值  是來自兩段數組中 未使用的最前面的節點中最小的 
            
            
            */
            int GetMinTreeNode(int end ,int end2) // 這里還可以優化 
            {
            	int i = 0,min1 = 0 ,min2 =end - 1,min;
            	for(i = 0 ; i < end2 ; i ++) 
            	{
            		if(used[i] == 0)
            		{
            			min1 = i ;
            			break;
            		}
            	}
            	for(i = end ; i < end2 ; i ++)
            	{
            		if(used[i] == 0)
            		{
            			min2 = i ;
            			break;
            		}
            	}
            	//min = min1 < min2 ?min1 :min2;
            	//if
            	if(ArrayTree[min1].data < ArrayTree[min2].data)
            		min = min1;
            	else 
            		min = min2;
            	used[min] = 1;
            	return min;
            
            }
            void updataTreeNode(int father ,int deep)
            {
            	int left = ArrayTree[father].left;
            	int right = ArrayTree[father].right;
            	if(father >= 2)
            	{
            		if(left != -1)
            		{
            			ArrayTree[left].deep = deep -1;
            			updataTreeNode(left,deep-1);
            		}
            		if( right != 1 )
            		{
            			ArrayTree[right].deep = deep -1;
            			updataTreeNode(right,deep-1);
            
            		}
            
            	}
            }
            
            /* 
            用一維數組模擬樹的建立 
            先排序 后根據哈弗曼算法 開始 建立樹 這里我根節點deep 有最大值 ,然后子節點一次遞減 
            
            */
            void Hafuman( int end )
            {
            	qsort(ArrayTree,end,sizeof(struct TreeNode),cmp);
            	
            	int i,mend = end;
            	struct TreeNode tNode;
            	for( i = 0 ; i < end -1; i ++)
            	{
            		tNode.left = GetMinTreeNode(end,end + i) ;
            		tNode.right = GetMinTreeNode(end,end + i);
            		ArrayTree[tNode.left].father = ArrayTree[tNode.right].father = end + i;
            		tNode.data = 	ArrayTree[tNode.left].data  + ArrayTree[tNode.right].data;
            		tNode.deep = GetMax(ArrayTree[tNode.left].deep ,ArrayTree[tNode.right].deep ) + 1;
            	//	updataTreeNode(end + i,	tNode.deep);//更新其子節點的深度值  這是一個bug 
            		ArrayTree[end + i] = tNode;
            
            		updataTreeNode(end + i,	tNode.deep);//更新其子節點的深度值 
            		
            	}
            }
            long GetHufuman(int end,int TreeDeep )
            {
            	int i,result = 0;
            	for(i = 0 ; i < end ; i ++)
            	{
            		result += (TreeDeep - ArrayTree[i].deep )*ArrayTree[i].data;
            	}
            	return result;
            }
            
            int main()
            {
            	int end,i;
            //	freopen("in.txt","r",stdin);
            	scanf("%d",&end);
            	
            	init();
            	for(i = 0 ; i < end ; i ++)
            		scanf("%d",&ArrayTree[i].data);
            
            	Hafuman(end);
            	printf("%d\n",GetHufuman(end,ArrayTree[2*end-2].deep));
            	
            	
            }
            posted on 2011-03-16 15:44 付翔 閱讀(284) 評論(0)  編輯 收藏 引用 所屬分類: ACM 數據結構

            <2010年4月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            CSDN - 我的blog地址

            博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产另类久久久精品小说| 少妇内射兰兰久久| 天天综合久久久网| 久久国产精品一区| 亚洲中文字幕久久精品无码APP| 久久夜色精品国产欧美乱| 九九热久久免费视频| 日本五月天婷久久网站| 99久久婷婷国产综合亚洲| 久久人人爽人人爽人人片AV麻豆 | 久久人人爽人人爽人人爽| 亚洲精品tv久久久久久久久| 天天爽天天爽天天片a久久网| 无码八A片人妻少妇久久| 91精品国产91久久| 午夜天堂av天堂久久久| 久久93精品国产91久久综合| 亚洲va国产va天堂va久久| 日韩电影久久久被窝网| 婷婷综合久久中文字幕| 精品综合久久久久久888蜜芽| 手机看片久久高清国产日韩| 日韩精品国产自在久久现线拍 | 狠色狠色狠狠色综合久久| 久久精品亚洲男人的天堂| 久久精品国产精品亚洲毛片| 亚洲v国产v天堂a无码久久| 狠狠色综合久久久久尤物| 日本福利片国产午夜久久| 成人妇女免费播放久久久| AV色综合久久天堂AV色综合在 | 老男人久久青草av高清| 久久精品无码av| 久久www免费人成看国产片| 91精品国产91久久综合| 国产精品免费看久久久| 国产国产成人精品久久| 99久久99久久| 国产成人精品久久一区二区三区av| 国产午夜福利精品久久2021| 久久r热这里有精品视频|