石子游戏
若一个节点可以被石子占据,则它的子节点必须依次被石子占据,每处理过一个子节点,总的石子数就会减一。则先将子节点所需石子数由高到低排序,令该节点石子数等于最大子节点石子数,然后减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;
}