• <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 數據結構

            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            CSDN - 我的blog地址

            博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            无遮挡粉嫩小泬久久久久久久| 99国内精品久久久久久久| 欧美国产成人久久精品| 囯产极品美女高潮无套久久久 | 青青青青久久精品国产h| 2021久久精品国产99国产精品| 国产精品一区二区久久| 久久亚洲av无码精品浪潮| 亚洲精品乱码久久久久久蜜桃图片 | 欧洲国产伦久久久久久久| 性做久久久久久久| 国产一区二区精品久久凹凸| 精品国产乱码久久久久软件| 久久99国产亚洲高清观看首页 | 久久久久久久波多野结衣高潮| 久久发布国产伦子伦精品 | 久久久无码精品亚洲日韩软件| 伊人久久大香线蕉亚洲五月天| 色综合久久88色综合天天| 亚洲AV无码久久精品色欲| 久久天天躁狠狠躁夜夜av浪潮| 久久久亚洲欧洲日产国码二区 | 青青草原1769久久免费播放| 久久精品国产亚洲αv忘忧草| 精品国产综合区久久久久久| 性欧美丰满熟妇XXXX性久久久 | 国产精品免费看久久久香蕉| 久久影院综合精品| 国产成人精品综合久久久| 婷婷久久综合| 97香蕉久久夜色精品国产| 久久久久97国产精华液好用吗| 99国产欧美久久久精品蜜芽| 亚洲伊人久久大香线蕉综合图片| 欧美亚洲日本久久精品| 久久亚洲欧洲国产综合| 久久久久国产精品三级网 | 久久免费的精品国产V∧| 亚洲AV无码1区2区久久 | 无码人妻久久久一区二区三区| 久久人人爽人人爽人人片AV东京热 |