1 条题解
-
0
正向求解比较麻烦,分析可知有三个变量n,x,k,其中n固定,若是双重for循环,则计算复杂,有很多无效计算;代码略;
在确定n和x的情况下,来求k:
- x的遍历范围可以从大到小,也可以从小到大;
- 若k符合条件(k为正整数),则更新x,k;
- 52周所攒金额:
n = 52 * (7x + (1+2+3+4+5+6)k )
- 所以倒推k为:
k = (n/52 - 7*x) / (6+5+4+3+2+1)
- 因此,在n固定的情况下,只需要确定x的值,就能确定k;x越大,则k越小。
- 判定条件:k的取值为为正整数;
#include <iostream> using namespace std; int main(){ int n; cin>>n; int x = 0,k = 0; int ret_x = 0,ret_k = 0x7fffffff; for(x = 1; x <= 100; ++x){ k = (n/52 - 7*x) / (6+5+4+3+2+1); if(k <= 0) break; if(k < ret_k && (n/52 - 7*x) % (6+5+4+3+2+1)==0 ){ ret_x = x; ret_k = k; } } cout<<ret_x<<"\n"<<ret_k; }
或者x从大到小:
#include <iostream> using namespace std; int main(){ int n; cin>>n; int x = 0,k = 0; int ret_x = 0,ret_k = 0x7fffffff; for(x = 100; x >= 1; --x){ k = (n/52 - 7*x) / (6+5+4+3+2+1); if(k <= 0) continue; if(k < ret_k && (n/52 - 7*x) % (6+5+4+3+2+1)==0 ){ ret_x = x; ret_k = k; break; } } cout<<ret_x<<"\n"<<ret_k; }
- 1
信息
- ID
- 8981
- 时间
- 1000ms
- 内存
- 63MiB
- 难度
- 1
- 标签
- 递交数
- 18
- 已通过
- 10
- 上传者