swjtu算法作业3

古卡萨人为了建造一个高塔,先采集了大量不同类型的石块。每种类型的石块的高度为hi数量为ci。他们在修建高塔之前,先通过占卜确定每种类型的石块能够摆放的最大高度,然后再将他们一块一块垒起来,最终完成了高塔的建造。

    请你根据现有石块的情况计算出他们最高能够建造出的高塔的高度。

输入要求:输入第1行为整数n,表示石块的类型。其后有n行,每一行包含三个整数hi (1 <= hi <= 100) ,ai(1 <= ai <= 40000),ci(1 <= ci <= 10),分别表示该类型的石块的高度,该类型石块能够摆放在塔上的最大高度以及该类型石块的数量。

输出要求:输出1行,包含一个整数,也就是利用这些石块能够建造的高塔的最大高度。

样例输入:

3

7 40 3

5 23 8

2 52 6

样例输出:

48

代码如下:

#include<iostream>
using namespace std;

int* h, * a, * c,*c1;
int num,n;
int temp, res;
void Swap(int& a, int& b)/*交换函数,将a和b的值互换*/
{
	int c = a;
	a = b;
	b = c;
}

int count()
{
	
	if (c1[num % n] > c[num % n])
	{
		if(num % n + 1<n)
	{
		c1[num % n + 1]++;
		c1[num % n] -= c[num % n];
	}
		if (num % n + 1 == n)
		{
			return -1;
		}
	}
	int res = c1[num % n];
	if(num%n==0)
	c1[0]++;
	num++;
	return res;
}

int main()
{
	num = 0;
	cin >> n;
	 h = new int[n];
	 a = new int[n];
	 c = new int[n];
	 c1 = new int[n];
	for (int i = 0; i < n; i++)
	{
		cin >> h[i] >> a[i] >> c[i];
		c1[i] = 1;
	}
	for (int i = 0; i < n; i++)
	{
		if (a[i] / h[i] < c[i])
			c[i] = a[i] / h[i];
	}
	
	temp = res = 0;
	for(int i=0;i<n-1;i++)
		for(int j=i+1;j<n;j++)
			if (a[i] > a[j])
			{
				Swap(a[i], a[j]);
				Swap(h[i], h[j]);
				Swap(c[i], c[j]);
		   }
	while(1)
	{
		bool pd = 0;
		for (int i = 0; i < n; i++)
		{
			int j = count();
			if(j!=-1)
			{
				if (temp + h[i] * j <= a[i])
					temp += h[i] * j;
			}
			else
			{
				pd = 1;
				break;
			}
		}
	
		if (temp > res)
			 res = temp;
		if (pd)
			break;
		temp = 0;
	}
	cout << res ;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值