poj1694

石子游戏
若一个节点可以被石子占据,则它的子节点必须依次被石子占据,每处理过一个子节点,总的石子数就会减一。则先将子节点所需石子数由高到低排序,令该节点石子数等于最大子节点石子数,然后减1,跟第二大子节点所需石子数比较,相差多少就将该节点所需石子数加几,同理,比较至最后一个,即可得出该节点所需石子数。利用递归即可求出根节点所需石子数。
#include<stdio.h>
int num[201];
int children[201][201];
 int stones(int n);
 void qsort(int *r,int low ,int high);
 int partition(int *r,int low,int high);

int main()
{
	unsigned char tree_num;
 int node_num;
int i,j;
	scanf("%d",&tree_num);
	while(tree_num--)
	{
		scanf("%d",&node_num);
		while(node_num--)
		{
			scanf("%d",&i);
			scanf("%d",&num[i]);
			for(j=0;j<num[i];j++)
			{
				scanf("%d",&children[i][j]);
			}
		}
		printf("%d\n",stones(1));
	}
	return  0;
}

 int stones(int n)
{
	 int temp[201];
	int i,k;
	int min;
	if(!num[n])
		return 1;
	for(i=0;i<num[n];i++)
	{
		temp[i]=stones(children[n][i]);
	}
	qsort(temp,0,num[n]-1);
    min=temp[0];
	for(i=1;i<num[n];i++)
	{
		k=temp[i]-(min-i);
		if(k>0)
			min+=k;
	}
	return min;
}
void qsort(int *r,int low ,int high)
{
	int pivot;
	if(low<high)
	{
		pivot=partition(r,low,high);
		qsort(r,low,pivot-1);
		qsort(r,pivot+1,high);
	}
}
int partition(int *r,int low,int high)
{
	int pivot_num=r[low];
	while(low<high)
	{
		while(r[high]<=pivot_num&&low<high)
			high--;
		r[low]=r[high];
		while(r[low]>=pivot_num&&low<high)
			low++;
		r[high]=r[low];
	}
	r[low]=pivot_num;
	return low;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值