1 条题解

  • 0
    @ 2025-8-24 22:42:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wuhan1234
    **

    搬运于2025-08-24 22:42:29,当前版本为作者最后更新于2023-04-10 05:58:19,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    A 2022

    采用 DP 求解。设 dpi,jdp_{i,j} 表示选 jj 个数总和为 ii 的方案数。

    编写的函数如下。

    int work1()
    {
        long long dp[2025][11]={0};   // dp[i][j]表示选j个数总和为i的方案数
        dp[0][0]=1;
        int i,j,k;
        for (i=1;i<=2022;i++)
        {
            for (j=10;j>=1;j--)
            {
                for (k=i;k<=2022;k++)
                {
                    dp[k][j]+=dp[k-i][j-1];
                }
            }
        }
    	printf("%lld\n",dp[2022][10]);
    }
    

    执行上面的处理函数,输出结果为:379187662194355221379187662194355221

    B 钟表

    将表盘的 00 点(或 1212 点)作为起点,整个表盘转一圈 360360 度,用 6060 个刻度线分成 6060 格,每 11 格就是 66 度。

    时钟每走 11 个小时,时针走 55 格,转 3030 度;分针走 6060 格,转 360360 度(正好走一圈,相当转 00 度);秒针走 36003600 格,转 2160021600 度(走了 6060 圈,也相当转 00 度)。

    时钟每走 11 分钟,分针走 11 格,转 66 度;时针走 5/605/60 格,转 1/21/2 度;秒针走 6060 格,相当转了 00 度。

    时钟每走 11 秒,秒针走 11 格,转 66 度;分针走 1/601/60 格,转 1/101/10 度;时针走 5/36005/3600 格,转了 1/1201/120 度。

    因此,对于任意一个时刻 hh:mm:sshh:mm:ss,有

    时针转的度数为 30×hh+mm/2+ss/12030\times hh + mm/2 + ss/120

    分针转的度数为 6×mm+ss/106\times mm + ss/10

    秒针转的度数为 6×ss6\times ss

    计算出各指针转的度数后,它们之间的差值就是它们的夹角。

    用三重循环对每一个时刻进行枚举,找到满足要求的时刻,输出即可。

    编写的函数如下。

    int gcd(int a,int b)
    {
        if (a%b==0) return b;
        else return  gcd(b,a%b) ;
    }
    int work2()
    {
        int h,m,s,x,y,z;
        for (h=0;h<=6;h++)
            for (m=0;m<60;m++)
                for (s=0;s<60;s++)
                {
                    x = 3600*h + 60*m + s ;  // 时针转的角度
                    y = 720*m + 12*s ;       // 分针转的角度
                    z = 720*s ;              // 秒针转的角度
                    int hm=x>y?x-y:y-x;
                    hm=hm%43200;
                    if (hm>43200-hm)    // 通分后,圆盘一周360度变成 43200度(360*120)
                        hm=43200-hm;
                    int k = gcd(hm,120) ;
                    int hm1=hm/k;      // 时针与分针的夹角hm1/hm2
                    int hm2=120/k;
                    int ms=y>z?y-z:z-y;
                    ms=ms%43200;
                    if (ms>43200-ms)    // 通分后,圆盘一周360度变成 43200度(360*120)
                        ms=43200-ms;
                    k = gcd(ms,120) ;
                    int ms1=ms/k;      // 分针与秒针的夹角ms1/ms2
                    int ms2=120/k;
                    if (hm1!=0 && hm1*ms2==2*ms1*hm2)
                    {
                        printf("%d %d %d\n",h,m,s);
                        return;
                    }
                }
    }
    

    执行上面的处理函数,输出结果为:44804 48 0

    有了上面的处理结果,提交给本题的源程序如下。

    #include <stdio.h>
    int main()
    {
        char T;
        scanf("%c",&T);
        if (T=='A') printf("379187662194355221\n");
        else if (T=='B') printf("4 48 0\n");
        return 0;
    }
    
    • 1

    信息

    ID
    7967
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者