题目描述
zc有很多根长度为n的木板,他想用这些木板做两个完全一样的门框。每个门框由两根竖直放置的木板和一根水平放置的木板组成。竖直放置的木板长度为a,水平放置的木板长度为b,这些木板必须完整,不能拼接而成。
请你计算最少需要多少木板来制作这两个门框。zc可以将木板任意分割,但是无法将木板拼接起来。
输入
第一行包含一个整数T(1<T<100),代表有T组数据。
每组数据有三行,第一行为一个整数n(1<=n<=1000)代表木板长度。
第二行为一个整数a,代表竖直放置木板的长度。
第三行为一个整数b,代表水平放置木板的长度。
输出
输出制作这两个门框的最小木板数量。
样例输入
2
8
1
2
5
3
4
样例输出
1
6
一个模拟+贪心题,找出最优的解, 看代码解释就懂了.
# include <stdio.h>
int main(void)
{
int t;
scanf("%d", &t);
while (t --)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
int q = 4, w = 2; // 竖直的需要4个, 横着的需要二个
int x1 = x, sum = 1;
if (x == y*2 + z) // 这个一定要写, 7 2 3 这种特殊情况, 如果不写输出的是4, 最优的为 2 2 3, 2 2 3二根就够了 按照代码写的为 3 3, 2 2 2, 2为3根
{
printf("2\n");
continue;
}
if (y > z) // 先减长的 贪心
{
while (q != 0 || w != 0) // q == 0 && w == 0 跳出
{
while (x1 >= y && q > 0) // 看是否够截取长的
{
x1 -= y;
q --;
}
while (x1 >= z && w > 0) // 看剩余的能不能截短的
{
x1 -= z;
w --;
}
if (q == 0 && w == 0) // 条件都满足了跳出
break;
sum ++; // 木条+1
x1 = x; // 给一根新的木条
}
}
else // 和上面的基本相同
{
while (q != 0 || w != 0)
{
while (x1 >= z && w > 0)
{
x1 -= z;
w --;
}
while (x1 >= y && q > 0)
{
x1 -= y;
q --;
}
if (q == 0 && w == 0)
break;
sum ++;
x1 = x;
}
}
printf("%d\n", sum);
}
return 0;
}