题目:http://poj.org/problem?id=1017
大意:有6种物品 高度相同 长宽分别为 1*1 2*2 3*3 4*4 5*5 6*6 问最少用多少 6*6 高度与之相同的箱子把这些物品装起来
很明显 这是一道模拟题,从大到小拿物品 每次拿完之后填空就OK了, 只要细心就可以过了····
值得一提的是,在discuss里看到了神代码,在这膜拜下
> #include<stdio.h>
> int main()
> {
> int n,a,b,c,d,e,f,x,y;
> int u[4]={0,5,3,1};
> while(1)
> {
> scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
> if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
> break;
> n=d+e+f+(c+3)/4;//懂了
> y=5*d+u[c%4];//在已有n个的情况下,能装下y个2*2的
> if(b>y)
> n+=(b-y+8)/9;//把多的2*2的弄进来
> x=36*n-36*f-25*e-16*d-9*c-4*b;
> if(a>x)
> n+=(a-x+35)/36;//把1*1的弄进来
> printf("%d\n",n);
> }
> return 0;
> }
下边贴的我的渣代码~
/**
吉林大学
Jilin U
Author: sinianluoye (JLU_LiChuang)
Date: 2014-07-26
Usage: AK专场? K
**/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ll long long
#define eps 1e-8
#define ms(x,y) (memset(x,y,sizeof(x)))
#define fr(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int a[10];
bool init()
{
bool f=0;
fr(i,1,6)
{scanf("%d",&a[i]);if(a[i])f=1;}
return f;
}
int ans;
void print(){}//for(int i=1;i<=6;i++)cout<<a[i]<<' ';cout<<endl<<ans<<endl;}
int doit()
{
ans=a[6];
a[6]=0;
print();
ans+=a[5];
a[1]-=a[5]*11;
if(a[1]<0)a[1]=0;
a[5]=0;
print();
ans+=a[4];
if(a[2]<=5*a[4])
{
a[1]-=20*a[4]-4*a[2];
a[2]=0;
if(a[1]<0)a[1]=0;
}
else a[2]-=5*a[4];
a[4]=0;
print();
ans+=a[3]/4;
a[3]%=4;
if(a[3]==1)
{
ans++;
int t=27;
if(a[2]<=5)
{
t-=a[2]*4;
a[2]=0;
}
else
{
a[2]-=5;
t=7;
}
a[1]-=t;
if(a[1]<0)a[1]=0;
}
else if(a[3]==2)
{
ans++;
int t=18;
if(a[2]<=3)
{
t-=a[2]*4;
a[2]=0;
}
else
{
a[2]-=3;
t=6;
}
a[1]-=t;
if(a[1]<0)a[1]=0;
}
else if(a[3]==3)
{
ans++;
int t=9;
if(a[2]<=1)
{
t-=a[2]*4;
a[2]=0;
}
else
{
a[2]-=1;
t=5;
}
a[1]-=t;
if(a[1]<0)a[1]=0;
}
a[3]=0;
print();
ans+=a[2]/9;
a[2]%=9;
if(a[2])
{
ans++;
a[1]-=(36-4*a[2]);
a[2]=0;
if(a[1]<0)a[1]=0;
}
a[2]=0;
print();
ans+=a[1]/36;
a[1]%=36;
if(a[1])
ans++;
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(init())
{
cout<<doit()<<endl;
}
}
/*************copyright by sinianluoye (JLU_LiChuang)***********/