1 条题解
-
0
思路
要把 分解成尽可能多的、大于 的奇数之和。
设分成 段。每段都是大于 的奇数,最小为 ,所以 ,即 ;又因为 个奇数之和与 同奇偶,所以 。
于是最大段数 :
- :,用 个 ;
- :,用 个 和一个 ;
- : 与 奇偶性不同(相差 ),取不到,最大只能是 ;构造上把两个 和一个 合成一个 :用 个 和一个 ( 时就是单独一个 ),恰好 段。
无解:它们无法写成大于 的奇数之和( 只能写成 ,而 不合法)。
每组 计算,总复杂度 ,空间复杂度 。
代码
#include <iostream> using namespace std; int main() { int t; cin >> t; // 测试数据组数 while(t--) { long long n; cin >> n; if(n == 1 || n == 2 || n == 4)// 这三种情况无法拆分,无解 { cout << -1 << endl; } else { int k = n % 3; if(k == 0 || k == 2) cout << n / 3 << endl; // 余 0:全用 3;余 2:把最后的 2 并成 5 else cout << n / 3 - 1 << endl; // 余 1:少用一个 3,与 1 合成 7 } } return 0; }
- 1
信息
- ID
- 31
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者