2020车牌问题:A 市的车牌由六位组成, 其中前三位可能为数字 0 至 9 , 或者字母 A 至F, 每位有 16 种可能。后三位只能是数字 0 至 9。为了减少攀比, 车牌中不能有连 续三位是相同的字符。
例如202020是合法的车牌,AAA202不是合法的车牌,请问A市有多少个合法的车牌
//暴力算法,有三位数字相同时不计数
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
long long ans = 0;
for (int i = 0; i <= 15; i++) {
for (int j = 0; j <= 15; j++) {
for (int k = 0; k <= 15; k++) {
if (i == j && j == k)
continue;
for (int q = 0; q <= 9; q++) {
if (k == q && j == k)
continue;
for (int w = 0; w <= 9; w++) {
if (k == q && q == w)
continue;
for (int e = 0; e <= 9; e++) {
if (q == w && w == e)
continue;
ans++;
}
}
}
}
}
}
printf("%lld\n", ans);
return 0;
}
2020数青蛙问题:“一只青蛙一张嘴, 两只眼睛四条腿。两只青蛙两张嘴, 四只眼睛八条腿。 三只青蛙三张嘴, 六只眼睛十二条腿⋯⋯ 二十只青蛙二卜张嘴, 四十只眼睛八 十条腿。"
请问上面这段文字, 如果完全不省略, 全部写出来, 从 1 到 20 只青蛙, 总 共有多少个汉字。
约定: 数字 2 单独出现读成 “两”, 在其他数里面读成 “二”, 例如 “十二”。 10 读作 “十”, 11 读作 “十一”, 22 读作 “二十二”。 只计算汉字个数,标点符号不算
//找规律
#include <stdio.h>
#include <stdlib.h>
int get(int n){
if(n>=1&&n<=10){
return 1;
}
if(n>=11&&n<=20||n%10==0){
return 2;
}
return 3;
}
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int ans=0;
int i=0;
for(i=1;i<=20;i++){
ans+=get(i);//青蛙
}
for(i=1;i<=20;i++){
ans+=get(i);//嘴
}
for(i=2;i<=40;i+=2){
ans+=get(i);//眼睛
}
for(i=4;i<=80;i+=4){
ans+=get(i);//腿
}
printf("%d",ans+200);
return 0;
}
2021双阶乘问题:一个正整数的双阶乘, 表示不超过这个正整数且与它有相同奇偶性的所有 正整数乘积。 n的双阶乘用n!!表示。请问 2021 ! !的最后 5 位 (这里指十进制位) 是多少?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long long sum=1;
for(int i=2021;i>0;i-=2){
sum*=i;
sum%=100000;//还不是很理解
}
printf("%lld",sum);
return 0;
}
P进制乘法表:给定 P,请输出 P 进制下的乘法表,输入一个整数 P,输出P进制下的乘法表
示例:4进制乘法表
1*1=1
2*1=2 2*2=10
3*1=3 3*2=12 3*3=21
#include <iostream>
#include <algorithm>
using namespace std;
int P;
char w[36];
string change(int n)
{
string s;
while(n)
{
s += w[n % P];
n /= P;
}
reverse(s.begin(), s.end());
return s;
}
int main()
{
cin >> P;
for (int i = 0; i <= 9; i ++) w[i] = (char)('0' + i);//0~9
for (int i = 10; i <= 35; i ++) w[i] = (char)('A' + i - 10);//A~Z
for (int i = 1; i < P; i ++)
{
for (int j = 1; j <= i; j ++) cout << w[i] << '*' << w[j] << '=' << change(i * j) << ' ';
cout << endl;
}
return 0;
}
2020斐波那契问题:定义了一个 Fibonacci 集合 F, 集合的元素如下定义:
- 最小的 5 个 Fibonacci 数 1,2,3,5,8 属于集合 F
- 如果一个元素 x 属于 F, 则 3x+2 ,5x+3和 8 x+5 都属于集合 F
- 其他元素都不属于 F
请问这个集合中第2020个元素是多少?
//深度搜索题,暴力算法
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int fx[100010];
bool is[100010];
void dfs(int n){
if(n > 100000) return ;
is[n] = true;
dfs(n*3+2);
dfs(n*5+3);
dfs(n*8+5);
}
int main(){
dfs(1);
dfs(2);
dfs(3);
dfs(5);
dfs(8);
int sum = 0;
for(int i = 1;i<=100010;i++){
if(is[i]){
sum ++;
if(sum == 2020){
cout<<i<<endl;
break;
}
}
}
return 0;
}
2020画中漂流问题:
题目描述:
在梦境中,你踏上了一只木筏,在江上漂流。
根据对当地的了解,你知道在你下游 D 米处有一个峡谷,如果你向下游前进大于等于 D 米则必死无疑。
现在你打响了急救电话,T 秒后救援队会到达并将你救上岸,水流速度是 1 米/秒,你现在有 M 点体力。
每消耗一点体力,你可以划一秒桨使船向上游前进 1 米,否则会向下游前进 1 米(水流),M 点体力需在救援队赶来前花光。
因为江面太宽了,凭借你自己的力量不可能上岸,请问,有多少种划桨的方案可以让你得救。
两个划桨方案不同是指:存在某一秒钟,一个方案划桨,另一个方案不划。
输入格式:
输入一行包含三个整数 D, T, M。
输出格式:
输出一个整数,表示可以让你得救的总方案数,答案可能很大,请输出方案数除以 1,000,000,007 的余数。
输入样例:
1 6 3
输出样例:
5
数据范围:
对于 50% 的评测用例,1 ≤ T ≤ 350
对于所有评测用例,1 ≤ T ≤ 3000 , 1 ≤ D ≤ T , 1 ≤ M ≤ 1500
/DFS算法
#include <iostream>
using namespace std;
const int MOD = 1e9 + 7;
int ans;
int D, T, M;
void dfs(int T, int M, int D) // 距离救援还有 T 秒,还剩 M 点体力,距离峡谷还有 D 米
{
if(!T)//如果时间为0即救援到达
{
if(!M) ans = (ans + 1) % MOD;//如果没有体力
return;
}
if(M > 0) dfs(T - 1, M - 1, D + 1);// 体力没消耗完且还没被救出则消耗体力,并递归调用,时间减少,体力减少,但距离增加了
if(D > 1) dfs(T - 1, M, D - 1);// 体力消耗完了但还没被救出,则只能等着时间减少,距离减少
int main()
{
cin >> D >> T >> M;
dfs(T, M, D);
cout << ans << endl;
return 0;
}