您的位置:首页 > 其它

POJ 1017 Packets(贪心)

2010-02-17 01:51 453 查看
//用贪心算法,从最大的装起,
//5*5->1*1;
//4*4->2*2->1*1;
//3*3分3种情况
//模4后剩1,剩2,剩3
//剩1的最多可再装5个2×2,再补1×1
//剩2的最多可装4个2×2,再补1×1
//剩3的只能装多1个2×2,再补1×1
#include<iostream>
using namespace std;
int main()
{
int a[7],n,c; // n为数量,c为容量
for(;;)
{
n = 0;c = 36;
for(int i = 1;i <= 6;++i)
cin >> a[i];
if(a[1] + a[2] + a[3] + a[4] + a[5] + a[6] == 0)break;
n += a[6];
while(a[5] != 0)
{
c -= 25;
--a[5];
++n;
while(c > 0 && a[1] > 0)
{
c--;
a[1]--;
}
c = 36;
}
while(a[4] != 0)
{
c -= 16;
++n;
--a[4];
while(c > 0 && a[2] > 0)
{
c -= 4;
a[2]--;
}
while(c > 0 && a[1] > 0)
{
c--;
a[1]--;
}
c = 36;
}
if(a[3] >= 4)
{
n += a[3] / 4;
a[3] %= 4;
}
if(a[3] == 1)
{
c -= 9;
++n;
while(c > 7 && a[2] > 0)
{
--a[2];
c -= 4;
}
while(c > 0 && a[1] > 0)
{
--a[1];
c -= 1;
}
c = 36;
}
if(a[3] == 2)
{
c -= 18;
++n;
while(c > 6 && a[2] > 0)
{
--a[2];
c -= 4;
}
while(c > 0 && a[1] > 0)
{
--a[1];
c -= 1;
}
c = 36;
}
if(a[3] == 3)
{
c -= 27;
++n;
while(c > 5 && a[2] > 0)
{
--a[2];
c -= 4;
}
while(c > 0 && a[1] > 0)
{
--a[1];
c -= 1;
}
c = 36;
}
n += a[2]/9;
a[2] %= 9;
if(a[2] > 0)
{
++n;
c -= a[2]*4;
while(a[1] > 0 && c > 0)
{
--a[1];
--c;
}
}
n += a[1] / 36;
a[1] %= 36;
if(a[1] > 0)	++n;
cout << n << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: