3 条题解

  • 1
    @ 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;
    }
    
    • 0
      @ 2025-8-11 11:20:44

      `#include

      using namespace std;

      int main(){ int n,x,k; cin>>n; for(int i=(n/(527)>100?100:n/(527)); i>=0 ;i--){ for(int j=1;j<= n/(5221); j++){ if(527i + 5221*j == n) { cout<<i<<endl<<j; return 0; } } } return 0; }`

      • 0
        @ 2025-7-26 23:30:09

        偏数学方法解决 推导: n=52*(7x+(6+5+4+3+2+1)k) n=52(7x+21k) n=364(x+3*k)

        #include <bits/stdc++.h>
        using namespace std;
        int n,x,k;
        //n=364*(x+3*k);
        //k=(n/364-x)/3;
        //x=n/364-3*k;
        int main()
        {
            cin>>n;
            n/=364;
            if (n>103)
            {
                k=(n-98)/3;
            }
            else
            {
                k=1;
            }
            x=n-3*k;
            cout<<x<<endl<<k;
            return 0;
        }
        
        • 1

        信息

        ID
        8981
        时间
        1000ms
        内存
        63MiB
        难度
        1
        标签
        递交数
        39
        已通过
        22
        上传者