牛客小白月赛53 E题 Calling(思维题)

这是一个关于编程竞赛的题目解析,主要涉及如何将不同尺寸的正方形纸片放入面积为36的正方形框中。题目要求在至多s个框内放置纸片,每个框可以放不同尺寸的纸片,且不必放满。代码实现中首先尝试放置大尺寸纸片,然后逐步处理小尺寸纸片,根据剩余空间判断是否能放下所有纸片。
摘要由CSDN通过智能技术生成

题目链接:E-Calling_牛客小白月赛53 (nowcoder.com)

题目描述

空。

你有 666 种正方形纸片,其中第 i(1≤i≤6)i (1\le i\le 6)i(1≤i≤6) 种边长为 iii,每一种都有 kik_iki​ 个,你需要把它们放在 至多 sss 个面积为 36(=6×6)36 (= 6 \times 6)36(=6×6) 的正方形框中,显然我们可以一个框一个框的放,要求如下:

  • 每个框不必放满。比如你可以把至多 363636 个边长为 111 的正方形纸片放在一个框中,也可以把 303030 个边长为 111 的正方形放在一个框中,也可以把 111 个边长为 555 的正方形纸片放在一个框中,等。
  • 每个框放的正方形边长不必相同。比如一个框中可以同时出现边长为 333 和边长为 111 的正方形。

请问能否放得下,若可以,输出 Yes\tt YesYes,否则输出 No\tt NoNo。

输入描述:

第一行,一个正整数 T(1≤T≤105)T (1\le T \le 10^5)T(1≤T≤105),表示 TTT 组数据。

对于每组数据:

第一行,一个非负整数 s(0≤s≤109)s(0 \le s\le 10^9)s(0≤s≤109)。
第二行,666 个非负整数,为 ki(0≤ki≤104)k_i (0 \le k_i \le 10^4)ki​(0≤ki​≤104)。

输出描述:

TTT 行,每行一个字符串 Yes\tt YesYes 或 No\tt NoNo,表示对应数据的答案。

请注意区分大小写。

示例1

输入

4
15
3 1 4 1 5 9
20
0 0 0 1 4 1
10
1 1 4 5 1 4
1024
123 456 1 3 4 10

输出

No
Yes
No
Yes

思路:

理清逻辑思路,先放6,5,4,3,然后放2,最后放1

代码:

#include<iostream>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>

using namespace std;

int t, s;
int a[6];

int main() {
    ios::sync_with_stdio(false);
    cout.tie(nullptr);

    cin >> t;
    while(t --) {
        cin >> s;
        for(int i = 0; i < 6; i ++) cin >> a[i];
        if(a[5] + a[4] + a[3] + ceil(a[2] * 1.0 / 4) > s) {
            cout << "No" << "\n";
        } else if (a[5] + a[4] + a[3] + ceil(a[2] * 1.0 / 4) == s) {
            if (4 - a[2] % 4 == 3) {
            if(a[1] > a[3] * 5 + 5) {
                cout << "No" << "\n";
            } else {
                 if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
                }
        } else if(4 - a[2] % 4 == 2) {
            if(a[1] > a[3] * 5 + 3) {
                cout << "No" << "\n";
            } else {
                    if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
            }
        }
        else if(4 - a[2] % 4 == 1) {
            if(a[1] > a[3] * 5 + 1) {
                cout << "No" << "\n";
            } else {
                    if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
            }

        } 
        else {
            if(a[1] > a[3] * 5) {
                cout << "No" << "\n";
            } else {
                 if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
            }
        }
        }
        else {  // have more free
        int free = s - a[5] - a[4] - a[3] - ceil(a[2] * 1.0 / 4);
            if (4 - a[2] % 4 == 3) {
            if(a[1] > a[3] * 5 + 5 + free * 9) {
                cout << "No" << "\n";
            } else {
                 if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
                }
        } else if(4 - a[2] % 4 == 2) {
            if(a[1] > a[3] * 5 + 3 + free * 9) {
                cout << "No" << "\n";
            } else {
                    if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
            }
        }
        else if(4 - a[2] % 4 == 1) {
            if(a[1] > a[3] * 5 + 1 + free * 9) {
                cout << "No" << "\n";
            } else {
                    if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
            }

        } 
        else {
            if(a[1] > a[3] * 5 + free * 9) {
                cout << "No" << "\n";
            } else {
                 if(a[0] > s * 36 - 36 * a[5] - 25 * a[4] - 16 * a[3] - 9 * a[2] - 4 * a[1]) {
                    cout << "No" << "\n";
                } else {
                    cout << "Yes" << "\n";
                }
            }
        }
        }

    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值