3994 水果派(向上取整转为向下取整)

1. 问题描述:

食堂需要做至少 a 份苹果派和至少 b 份香蕉派。已知,一个苹果可以做 c 份苹果派,一个香蕉可以做 d 份香蕉派。食堂共可以采购不超过 k 个水果。请提供一种食堂采购水果的方案,以满足制作水果派的需求。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。每组数据占一行,包含 5 个整数 a,b,c,d,k。

输出格式

每组数据输出一行结果,如果存在合理方案,则输出两个整数 x,y,表示需要采购的苹果和香蕉数量。如果不存在合理方案,则输出 −1。任意合理方案均可。

数据范围

前三个测试点满足,1 ≤ T ≤ 10。
所有测试点满足,1 ≤ T,a,b,c,d,k ≤ 100。

输入样例:

3
7 5 4 5 8
7 5 4 5 2
20 53 45 26 4

输出样例:

7 1
-1
1 3
来源:https://www.acwing.com/problem/content/3997/

2. 思路分析:

分析题目可以知道制作a份苹果派至少需要⌈a / c⌉个苹果,制作b份香蕉派需要⌈b / d⌉个香蕉,如果他们的和超过了k说明不满足条件输出-1,否则输出至少需要的苹果数和香蕉数,在写代码的时候向上取整可以转换为向下取整,公式为⌈x / k⌉ = (x + k - 1) / k。

3. 代码如下:

class Solution:
    def process(self):
        T = int(input())
        for t in range(T):
            a, b, c, d, k = map(int, input().split())
            t1, t2 = (a + c - 1) // c, (b + d - 1) // d
            # 大于k表示无解
            if t1 + t2 > k:
                print(-1)
            else:
                print(t1, t2)


if __name__ == '__main__':
    Solution().process()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个功能,你需要在窗口的消息循环中添加对鼠标消息的处理。具体来说,你需要在窗口过程中添加 WM_LBUTTONDOWN 消息的处理,然后在处理函数中获鼠标当前位置,并判断当前位置是否在水果的范围内。如果是,则将水果分成两半,即将水果的位图对象分成两个新的位图对象,并显示在窗口上。 下面是一个简单的实现示例(假设你已经加载了一个名为 fruit.bmp 的位图文件,并且将它显示在了窗口上): ``` LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HBITMAP fruit = LoadBitmap(hInstance, "fruit"); static int fruitWidth = 200, fruitHeight = 200; static int fruitPosX = 100, fruitPosY = 100; switch (message) { case WM_LBUTTONDOWN: int mouseX = LOWORD(lParam); int mouseY = HIWORD(lParam); if (mouseX >= fruitPosX && mouseX <= fruitPosX + fruitWidth && mouseY >= fruitPosY && mouseY <= fruitPosY + fruitHeight) { // 分割水果 HDC hdc = GetDC(hWnd); HDC fruitDC = CreateCompatibleDC(hdc); HBITMAP leftFruit = CreateCompatibleBitmap(hdc, fruitWidth / 2, fruitHeight); HBITMAP rightFruit = CreateCompatibleBitmap(hdc, fruitWidth / 2, fruitHeight); SelectObject(fruitDC, fruit); SelectObject(hdc, leftFruit); BitBlt(hdc, 0, 0, fruitWidth / 2, fruitHeight, fruitDC, 0, 0, SRCCOPY); SelectObject(hdc, rightFruit); BitBlt(hdc, 0, 0, fruitWidth / 2, fruitHeight, fruitDC, fruitWidth / 2, 0, SRCCOPY); DeleteDC(fruitDC); ReleaseDC(hWnd, hdc); // 更新水果位置和大小 fruitWidth /= 2; fruitPosX += fruitWidth; InvalidateRect(hWnd, NULL, TRUE); // 刷新窗口 } break; case WM_PAINT: PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); HDC fruitDC = CreateCompatibleDC(hdc); SelectObject(fruitDC, fruit); BitBlt(hdc, fruitPosX, fruitPosY, fruitWidth, fruitHeight, fruitDC, 0, 0, SRCCOPY); DeleteDC(fruitDC); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(fruit); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } ``` 这个示例中,我们在窗口过程中添加了对 WM_LBUTTONDOWN 消息的处理,当鼠标左键按下时,它会检测当前鼠标位置是否在水果的范围内,如果是,则将水果分割成两半,并更新水果的大小和位置。然后在 WM_PAINT 消息中绘制水果,最后在 WM_DESTROY 消息中释放资源并退出程序。 需要注意的是,为了在窗口上绘制位图,我们需要使用 GDI(图形设备接口)函数,如 BitBlt 函数和 CreateCompatibleBitmap 函数等。同时,我们还需要在分割水果后调用 InvalidateRect 函数刷新窗口,以便在下一次 WM_PAINT 消息时重新绘制窗口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值