题目链接: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;
}