POJ 1017 Packets ----模拟

题目: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)***********/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值