古卡萨人为了建造一个高塔,先采集了大量不同类型的石块。每种类型的石块的高度为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;
}