【蓝桥杯】C++ 第20场 小白入门赛
一、四个亲戚
题目
四个亲戚
题目分析
字面意思:Daiyu+‘kind’
代码
#include <iostream> using namespace std; int main() { cout<<"Daiyu'kind'"; return 0; }
二、黛玉泡茶
题目
黛玉泡茶
题目分析
1.我们可以c
2.然后c
3.计算c,如果不能,整除后的答案还要加1
代码
#include <iostream> #include <algorithm> using namespace std; int main() { int n, m, k; int c[1000]; cin >> n >> m >> k; for (int i = 0; i < n; i++) { cin >> c[i]; } sort(c, c + n);//需要斟满的茶杯最小容量 long long int sum = 0, count = 0; for (int i = 0; i < k; i++) //需要斟满的茶杯最小容量 { sum += c[i]; } if (sum % m != 0)//需要斟满的茶杯最小容量 { count = sum / m + 1; } else { count = sum / m; } cout << count; return 0; }
三、宝玉请安
题目
宝玉请安
题目分析
分为三种情况,将宝玉、衡芜苑和潇湘馆所在位置距离正门的步数分别记为x,y,z。
1.当x<y且x<z时,步数为y与z两者之中最大者减去x
2.当x>y且x>z时,步数为x减去y与z两者之中最小者
3.当x位于y,z之间,先计算x距离y的距离与x距离z的距离那个小,即为mid,然后再将mid加上y与z之间的距离即为最大步数
代码
#include <iostream> using namespace std; int main() { int t; cin >> t; for (int i = 0; i < t; i++) { int x, y, z, count=0; cin >> x >> y >> z; if (x < y && x < z) { count = max(y, z) - x; } else if (x > y && x > z) { count = x - min(y, z); } else { int mid = min(max(y, z) - x, x - min(y, z)); count = mid + (max(y, z) - min(y, z)); } cout << count << endl; } return 0; }
四、贾母祝寿
题目
贾母祝寿
题目分析
思路一
这个思路是考试的时候写题想的,样例是对的,但是不能过。
过程就是硬推操作过程,然后将数组进行绝对值处理,然后排序,输出最大值
思路二
后面发现只需要抓住一个点,最值只会出现在首尾。
每次操作时,如果是1,则让首加y,如果是2,则让尾减y,还要注意x==n的特殊情况
代码
代码一
#include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; int main() { long long int n, q; cin >> n >> q; vector<long long int> a(n, 0); for (long long int i = 0; i < q; i++) { long long int t, x, y; cin >> t >> x >> y; if (t == 1) { for (long long int j = 0; j < x ; j++) { a[j] += y; } } else if (t == 2) { // 从数组末尾开始向前遍历 x 个元素 for (long long int j = n - 1; j >= n - x ; j--) { a[j] -= y; } } } transform(a.begin(), a.end(), a.begin(), [](long long int val) { return abs(val); }); auto max_brightness = *max_element(a.begin(), a.end()); // 输出最大亮度值 cout << max_brightness << endl; return 0; }
代码二
#include <iostream> using namespace std; int main() { int n, q; long long int ans1 = 0, ans2 = 0; cin >> n >> q; for (int i = 0; i < q; i++) { int t, x, y; cin >> t >> x >> y; if (t == 1) { ans1 += y; if (x == n) { ans2 += y; } } else { ans2 -= y; if (x == n) { ans1 -= y; } } } ans2 = -ans2; if (ans1 > ans2) { cout << ans1; } else { cout << ans2; } return 0; }
五、清洁客房
题目
清洁客房
题目分析
1.使用动态规划的方法
2.当只有1间客房时,且要求使用1种清洁等级(至少为1),则有9种方案(从1到9),所以为dp[1][1]=9
3.对于第i间客房,如果只用1种清洁等级,那么它必须和前一间客房使用相同的等级,所以 dp[i][1] = dp[i-1][1]
。
4.如果用2种清洁等级,那么第i间客房可以选择和前一间客房相同的等级(此时前i-1间客房已经用了2种等级),或者选择一个新的等级(此时前i-1间客房只用了1种等级,且第i间客房的等级不能和前一间相同,所以有9-1=8种选择)。因此,dp[i][2] = dp[i-1][2] * 2 + dp[i-1][1] * 9
。
5.如果用3种清洁等级,那么第i间客房可以选择和前一间客房相同的等级(此时前i-1间客房已经用了3种等级),或者选择一个新的等级(此时前i-1间客房用了2种等级,且第i间客房的等级不能和前一间相同,也不能和之前已经用过的另一种等级相同,所以有9-2=7种选择,但因为前i-1间客房的两种等级可以互换,所以实际上是8种选择)。因此,dp[i][3] = dp[i-1][3] * 3 + dp[i-1][2] * 8
。
举例
假设n=3,我们要求的是3间客房使用3种不同清洁等级的方案数。
- 对于第1间客房,有9种选择(1到9)。
- 对于第2间客房,如果它和第1间客房使用相同的等级,那么前2间客房只用了1种等级;如果它选择一个新的等级,那么前2间客房用了2种等级。
- 对于第3间客房,如果它和前一间客房使用相同的等级,那么前3间客房可能用了1种或2种或3种等级;如果它选择一个新的等级,那么前3间客房一定用了3种等级
代码
#include <iostream> using namespace std; const int mod = 1e9 + 7; const int n = 1e5 + 6; long long int dp[n][4]; int main() { dp[1][1] = 9;//当只有1间客房时,且要求使用1种清洁等级(至少为1),则有9种方案(从1到9) for (int i = 2; i < n; i++) { //对于i间客房,使用1种清洁等级时,只能继承前一间客房的1种清洁等级 dp[i][1] = dp[i - 1][1] % mod; /*对于i间客房,使用2种清洁等级时,可以是在前一间客房使用2种等级的 基础上再添加一种相同的等级(乘以2),或者是在前一间客房使用1种等级 的基础上添加一种新的等级(乘以9,因为新的等级可以是1到9中的任意一 种,但不能是之前使用的那个等级,但0不能作为新的等级)*/ dp[i][2] = (dp[i - 1][2] * 2 + dp[i - 1][1] * 9) % mod; /*对于i间客房,使用3种清洁等级时,可以是在前一间客房使用3种等级的 基础上再添加一种相同的等级(乘以3,因为3种等级都可以作为新的“相 同”等级),或者是在前一间客房使用2种等级的基础上添加一种新的等级 (乘以8,因为新的等级可以是剩下的7种等级中的任意一种,但0不能作为新的等级)*/ dp[i][3] = (dp[i - 1][3] * 3 + dp[i - 1][2] * 8) % mod; } int t; cin >> t; for (int i = 0; i < t; i++) { int n; cin >> n; cout << dp[n][3] << endl; } return 0; }