JSOI2007奶酪题解

18 篇文章 0 订阅
16 篇文章 0 订阅

题目描述

奶酪和pizza一样,是一小块扇形的固体。在奶酪从工厂里生产出来的时候,一共有4种形状,编号为1~4,分别是圆心角为72º;,144º;,216º;,288º;的扇形。奶酪的盒子是圆形的,半径和奶酪的半径一致。也就是说,一块1号奶酪和一块4号奶酪可以恰好装入一个盒子,一块2号奶酪和一块3号奶酪可以恰好装入一个盒子。

你的任务是写一个程序,计算给定的奶酪最多可以装满几个盒子。

输入格式

一行,四个数字,表示1~4号奶酪的数量,都在0~100之内

输出格式

一个数字,表示可以装满几个盒子

样例输入
2 1 1 1

样例输出

2

 

解题思路:

利用给定的1~4号的奶酪数量,拼成最多的整个奶酪。这道题不仔细看题目的话会认为只有两种拼接方式,我就在这里错了很多次。这道题一共有六种拼接方式。那么为了使能拼成的整个奶酪尽可能多,就要有一定的拼接顺序。这题使用贪心算法就可以。贪心策略是优先使用最少的数目组合去去拼接整块奶酪。然后完成一种拼接判断是否能使用下一种方式。

拼接方法和使用的数目如下(按优先级排列):

(1)72×1和288×1 总数为2

(2)144×1和216×1 总数为2

(3)72×2和216×1 总数为3

(4)72×1和144×2 总数为3

(5)72×3和144×1 总数为4

(6)72×5 总数为5

 

AC代码:

#include<iostream>

usingnamespace std;

 

intdata[5];

inttotal=0;

intx1=0;

intx2=0;

intx3=0;

intx4=0;

intx5=0;

intx6=0;

 

intMin(int a,int b)

{

     if(a<b)

         return a;

     return b;

}

intmain()

{

     for(int i=1;i<5;++i)

         cin>>data[i];

     x1=Min(data[1],data[4]);      //1和4

     x2=Min(data[2],data[3]);      //2和3

     int margin[5];       

     margin[1]=data[1]-x1;

     margin[4]=data[4]-x1;

     margin[2]=data[2]-x2;

     margin[3]=data[3]-x2;

     if(margin[1]>=2&&margin[3]>=1)

     {

         x3=Min(margin[1]/2,margin[3]);//1和3组合 1:72*2 3:216  3

         margin[1]-=x3*2;  //更新

         margin[3]-=x3;

     }

     if(margin[1]>=1&&margin[2]>=2)

     {

         x4=Min(margin[1],margin[2]/2);    //1和2组合  1:72 2:2*144 3

         margin[1]-=x4; //更新

         margin[2]-=x4*2;

     }

     if(margin[1]>=3&&margin[2]>=1)

     {

         x5=Min(margin[1]/3,margin[2]);    //1和2组合  1:72*3 2: 1*144 4

         margin[1]-=x5*3;  //更新

         margin[2]-=x5;

     }

     if(margin[1]>=5)

         x6=margin[1]/5;        //只用1(5个1)  5

     cout<<x1+x2+x3+x4+x5+x6<<endl;

     return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值