⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c.cpp

📁 ACM大赛基本练习题
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>

#define SIZE 1048576

typedef struct Node Node;

struct Node
{
	int pos;
	int size;
	int used;
	Node *left;
	Node *right;
};

Node *getNode( int pos, int size )
{
	Node *nod = ( Node * ) malloc( sizeof( Node ) );
	nod->left = NULL;
	nod->right = NULL;
	nod->pos = pos;
	nod->size = size;
	nod->used = 0;

	return nod;
}

int insert( Node *nod, int size )
{
	int half = nod->size / 2;

	if( nod->used || size > nod->size )
		return 0;

	if( size > half )
	{
		if( nod->left == NULL )
		{
			nod->used = 1;
			return 1;
		}
		else
			return 0;
	}

	if( nod->left == NULL )
		nod->left = getNode( nod->pos, half );

	if( insert( nod->left, size ) )
		return 1;
	else
	{
		if( nod->right == NULL )
			nod->right = getNode( nod->pos + half, half );
		
		if( insert( nod->right, size ) )
		{
			if( nod->left->used && nod->right->used )
				nod->used = 1;
			return 1;
		}
		else
			return 0;
	}
}

void clear_it( Node *nod )
{
	if( !nod )
		return;
	clear_it( nod->left );
	clear_it( nod->right );
	free( nod );
}

void make_it()
{
	int i;
	int num;
	int nowSize;
	int count;

	Node *head = getNode( 0, SIZE );
	
	scanf( "%d", &num );

	count = 0;
	
	for( i = 0; i < num; ++i )
	{
		scanf( "%d", &nowSize );
		if( insert( head, nowSize ) )
			++count;
	}
	
	printf( "%d\n", count );

	clear_it( head );
}

int main()
{
	int dataCase, i;

	scanf( "%d", &dataCase );

	for( i = 0; i < dataCase; ++i )
		make_it();

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -