P8789 [蓝桥杯 2022 国 B] 填空问题 题解
A 2022
采用 DP 求解。设
编写的函数如下。
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]);
}
执行上面的处理函数,输出结果为:
B 钟表
将表盘的
时钟每走
时钟每走
时钟每走
因此,对于任意一个时刻
时针转的度数为
分针转的度数为
秒针转的度数为
计算出各指针转的度数后,它们之间的差值就是它们的夹角。
用三重循环对每一个时刻进行枚举,找到满足要求的时刻,输出即可。
编写的函数如下。
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;
}
}
}
执行上面的处理函数,输出结果为:
有了上面的处理结果,提交给本题的源程序如下。
#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;
}