@guxier
2022-04-10T10:01:40.000000Z
字数 3637
阅读 613
蓝桥杯
本题总分:5 分
九进制正整数 (2022)9 转换成十进制等于多少?
1478
#include <iostream>using namespace std;int main(){string n = "2022";int ans;ans = (n[0] - '0') * 9;ans = (n[1] - '0' + ans) * 9;ans = (n[2] - '0' + ans) * 9;ans = (n[3] - '0' + ans);cout << ans;return 0;}
本题总分:5 分
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日
期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺
子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123;
而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022
年份中,一共有多少个顺子日期。
14
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
进制规定了数字在数位上逢几进一。
X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则 X 进制数 321 转换为十进制数为 65。
现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进制。请你算出 A − B 的结果最小可能是多少。
请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数
字要小于其进制。
第一行一个正整数 N,含义如题面所述。
第二行一个正整数 Ma,表示 X 进制数 A 的位数。
第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各个数位上的数字在十进制下的表示。
第四行一个正整数 Mb,表示 X 进制数 B 的位数。
第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各个数位上的数字在十进制下的表示。
请注意,输入中的所有数字都是十进制的。
输出一行一个整数,表示 X 进制数 A − B 的结果的最小可能值转换为十进制后再模 1000000007 的结果。
11310 4 031 2 0
94
当进制为:最低位 2 进制,第二数位 5 进制,第三数位 11 进制时,减法得到的差最小。此时 A 在十进制下是 108,B 在十进制下是 14,差值是 94。
对于 30% 的数据,
对于 100% 的数据,.
差值最小,必要前提是 a,b的每位数的进制最低。
取进制最低方法即为:第i位的进制=a和b第i位数字最大值+1。(若a,b都=0,即取2进制)
#include <bits/stdc++.h>#define rep(i, a, n) for ( int i = a; i <= n; i++)#define per(i, a, n) for ( int i = n; i >= a; i--)#define debug(x) cout << #x << ": " << x << endl#define MOD 1000000007using namespace std;/*=====================Guxier=====================*/const int N = 1e5 + 10;int n ;int a[N] , b[N];int p[N]; //用来存放每个数位的进制int main(){cin >> n;int ma;cin >> ma;rep(i , 1, ma) cin >> a[i], p[i] = max(a[i] + 1, 2);int mb;cin >> mb;rep(i , 1, mb) cin >> b[i], p[i] = max(b[i] + 1, p[i]);rep(i , 1 , ma-1)a[i+1] += (a[i] - b[i]) *p[i+1];cout << a[ma] % MOD;return 0;}
本题总分:25 分
话说大诗人李白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白这一路遇到店和花的顺序,有多少种不同的可能?注意:壶里没酒 ( 0 斗) 时遇店是合法的,加倍后还是没酒;但是没酒时遇花是不合法的。
第一行包含两个整数 N 和 M.
输出一个整数表示答案。由于答案可能很大,输出模 1000000007 的结果。
5 10
14
如果我们用 0 代表遇到花,1 代表遇到店,14 种顺序如下:
010101101000000010110010010000011000110010000100010110010000011001000110000100011000110000100100010110000010110100000100011001001000100100011001000100100100011000100011010000010100100100100010100101000001010100
对于 40% 的评测用例:1 ≤ N, M ≤ 10。
对于 100% 的评测用例:1 ≤ N, M ≤ 100。
深搜没啥好说的,枚举每种情况,排除所有不合法的情况进行剪枝
有以下三种情况:
1. 花、店的数目超过总量
2. 酒的余量为负数
3. 最后一个位置遇到的不是花,或最后一个位置遇到花后酒的余量还不为0
#include <bits/stdc++.h>#define rep(i, a, n) for ( int i = a; i <= n; i++)#define per(i, a, n) for ( int i = n; i >= a; i--)#define debug(x) cout << #x << ": " << x << endl#define MOD 1000000007using namespace std;typedef long long LL;/*=====================Guxier=====================*/const int N = 110;LL n , m , ans , len;LL t[N]; //用来记录李白路过花和店的序列void dfs(int i, LL k, LL a, LL b){if(a > m || b > n) return;//花、店的数目超过总量if(i == len-1) //最后一个必为花,且酒的余量为0{if(k == 1 && a == m-1 && b == n){//rep(j , 1, len) cout << t[j];//cout << endl;ans++;}return;}if(k <= 0) return; //酒余量不能为负//a是遇到的花的数目 b是遇到店的数目//t[i] = 0;dfs(i+1, k-1 , a+1 , b);//t[i] = 1;dfs(i+1, k+k , a , b+1);}int main(){cin >> n >> m;len = n + m;dfs(0 , 2 , 0 , 0);ans = ans % MOD;cout << ans;return 0;}
dp[i][j][k] 表示为前i次 有j次遇到店 剩下酒为k斗
因为n,m最大值为100,因此当k>100之后,该情况必然不合法
#include <bits/stdc++.h>#define rep(i, a, n) for ( int i = a; i <= n; i++)#define per(i, a, n) for ( int i = n; i >= a; i--)#define debug(x) cout << #x << ": " << x << endl#define MOD 1000000007using namespace std;typedef long long LL;/*=====================Guxier=====================*/const int N = 210;LL n , m , ans , len;LL dp[N][N][N]; //前i次 有j次遇到店 剩下酒为k斗int main(){cin >> n >> m; //N店 M花len = n + m;dp[0][0][2] = 1; // 李白初始有2 斗酒rep(i , 1 , len)rep(j , 0 , n)rep(k , 0 , 100){dp[i][j][k] += dp[i-1][j][k+1]; //遇到花if(j && k % 2 == 0) //遇到店dp[i][j][k] += dp[i-1][j-1][k/2];dp[i][j][k] %= MOD; //答案取模}dp[len][n][0] = dp[len-1][n][1]; //最后遇到的一个一定是花cout << dp[len][n][0];return 0;}