1 条题解

  • 0
    @ 2025-3-14 10:27:20

    正向求解比较麻烦,分析可知有三个变量n,x,k,其中n固定,若是双重for循环,则计算复杂,有很多无效计算;代码略;

    在确定n和x的情况下,来求k:

    • x的遍历范围可以从大到小,也可以从小到大;
    • 若k符合条件(k为正整数),则更新x,k;
    1. 52周所攒金额:
    n = 52 * (7x + (1+2+3+4+5+6)k )
    
    1. 所以倒推k为:
    k = (n/52 - 7*x) / (6+5+4+3+2+1)
    
    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
    上传者