第一次参加蓝桥杯进国赛了,今天更新一下参加国赛的心得和写出的题吧~
试题 A: 2022
思路:这题用的是三维背包,定义f[i][j][v]表示从前i个中选j个和为v的方案种数,那么可以得到状态转移方程,注意f数组开longlong,不然会爆int
选i: f[i][j][v] = f[i - 1][j - 1][v - i]
不选i: f[i][j][v] += f[i - 1][j][v]
答案:379187662194355221
代码如下:
#include <iostream>
using namespace std;
const int N = 2030;
typedef long long LL;
int n, m, k;
LL f[N][11][N];
int main()
{
cin >> n >> m >> k;
f[0][0][0] = 1;
for(int i = 1; i <= n; i ++ )
for(int j = 0; j <= m; j ++ )
for(int v = 0; v <= k; v ++ )
{
//选i
if(v - i >= 0 && j - 1 >= 0)
f[i][j][v] = f[i - 1][j - 1][v - i];
//不选i
f[i][j][v] += f[i - 1][j][v];
}
cout << f[n][m][k] << endl;
return 0;
}
试题 B: 钟表
思路:这题考试的时候一开始没看懂(不经常看这种表),白给...
答案:4 48 0
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
for(double s = 0; s <= 6; s ++ )
for(double f = 0; f < 60; f ++ )
for(double m = 0; m < 60; m ++)
{
double a = s / 12 + (f + m * 60 ) / (60 * 12);
double b = f / 60 + m / (60 * 60);
double c = m / 60;
double x = fabs(a - b) > 0.5 ? 1 - fabs(a - b) : fabs(a - b);
double y = fabs(b - c) > 0.5 ? 1 - fabs(b - c) : fabs(b - c);
if(fabs(x - 2 * y) < 1e-6)
cout << s << " " << f << " " << m << endl;
}
return 0;
}
<