• <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地址

            博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久九色综合九色99伊人| 久久久久无码精品| 亚洲精品国产自在久久| 日本一区精品久久久久影院| 久久夜色精品国产网站| 精品熟女少妇AV免费久久| 国产精品久久久久久五月尺| 欧美与黑人午夜性猛交久久久 | 99久久99久久精品国产| 精品久久久久久无码专区不卡| 性欧美大战久久久久久久久 | 国产精品毛片久久久久久久| 久久综合狠狠综合久久| 久久久av波多野一区二区| 无码久久精品国产亚洲Av影片| 久久久久久久97| 香蕉久久夜色精品升级完成| 人妻少妇久久中文字幕一区二区 | 国产高潮国产高潮久久久| 久久精品人人槡人妻人人玩AV| 欧美一区二区三区久久综合| 久久综合噜噜激激的五月天| 丁香五月网久久综合| 99久久精品免费国产大片| 久久免费大片| 亚洲国产欧美国产综合久久| 亚洲AV无码久久寂寞少妇| 久久久久国产精品| 久久人人爽人爽人人爽av| 久久精品国产亚洲AV忘忧草18| 色偷偷88888欧美精品久久久| 成人久久久观看免费毛片| 久久天天躁狠狠躁夜夜av浪潮| 大香伊人久久精品一区二区| 久久久久亚洲av无码专区导航| 久久免费视频观看| 偷窥少妇久久久久久久久| 久久国产精品成人免费| 久久影视国产亚洲| 精品久久久久久中文字幕人妻最新| 精品欧美一区二区三区久久久|