一只小蒟蒻备考蓝桥杯的日志
文章目录
- 笔记
- mod
- 进制转换
- 轻轻崩溃
- 前缀和 差分
- 双指针(夹逼)
- 人脑思维...->计算机思维
- 历史遗留问题1--22年B组初赛
- 历史遗留问题2--试题 基础练习 阶乘计算
- 刷题
- 心得
- 小结
笔记
mod
进制转换
进制转换——颠覆小蒟蒻认知了!
轻轻崩溃
题目描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?输入格式
输入一行包含三个整数 a , b 和 n。输出格式
输出一个整数代表天数。输入样例
10 20 99输出样例
8数据范围
对于 50% 的评测用例,1≤a,b,n≤10^6,
对于 100% 的评测用例,1≤a,b,n≤10^18
- 这么简单,应该是送分题,但是!
- (1)数据范围 10^18 -> long long
- (2)考点:模拟,但是这么大的数据量你不会真一次次加吧?
- (3)简单计算题,先算几个星期,然后推出日期
前缀和 差分
参考 前缀和以及差分看这一篇就够了
…居然这么基础的都忘记了
一维数组公式:
s[i] = s[i-1]+a[i]
二维数组公式:
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + arr[i][j]
双指针(夹逼)
参考 双指针法—将序列双层遍历优化为单层
步骤:
- 确定左右边界
- 循环
- 条件判断,左移右边界or右移左边界
- 碰撞检测
人脑思维…->计算机思维
问题描述123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式输入一行,包含一个正整数n。输出格式按从小到大的顺序输出满足条件的整数,每个整数占一行。样例输入
52样例输出
899998
989989
998899数据规模和约定1<=n<=54。
我居然…一门心思把回文数找出来,结果是有策略的枚举
核心代码:
//ijkkjiif (N % 2 == 0) {for(int i = 1; i <= 9; i++) {for(int j = 0; j <= 9; j++) {for(int k = 0; k <= 9; k++) {if((i + j + k)*2 == N) {cout << i * 100000 + j * 10000 + k * 1100 + j * 10 + i << endl;}}}}}
Attention:
不要轻易 /2, 以这题为例,很容易舍,然后WA,很心疼
历史遗留问题1–22年B组初赛
最小
#include <stdio.h>
#include <iostream>
#include <string.h>using namespace std;long long cal[505][505];long long Cal(int i, int j) {return (cal[i - 1][j] + cal[i][j - 1] - cal[i - 1][j - 1]);
}long long Cal2(int x1, int y1, int x2, int y2) { //including (x1, y1)cout << cal[x2][y2] << " " << cal[x2][y1 - 1] << " " << cal[x1 - 1][y2] << " " << cal[x1 - 1][y1 - 1]; return (cal[x2][y2] - cal[x2][y1 - 1] - cal[x1 - 1][y2] + cal[x1 - 1][y1 - 1]);
}int main() {int N, M, K;cin >> N >> M >> K;memset(cal, '\0', sizeof(cal));for(int i = 1; i <= N; i++) {for(int j = 1; j <= M; j++) {int input;cin >> input;cal[i][j] = Cal(i, j) + input;}}for(int i = 1; i <= N; i++) {for(int j = 1; j <= M; j++) {cout << cal[i][j] << " ";}cout << endl;}int ans = 0;for(int left = 1; left <= M; left++) {for(int right = left; right <= M; right++) {//left and right border have been decidedfor(int top = 1, botton = 1; top <= N && botton <= N; botton++) {int mid = Cal2(left, top, right, botton);cout << mid << endl;while(top <= botton && mid > K){top++;}/*Wrong Display start*/
// ans += (botton - top + 1) * (botton - top) / 2;/*不是在top到button间进行组合,必须包含top行不然top下移的时候,大大repeat了*//*end*/if(top <= botton) {ans += (botton - top + 1);cout<< left << " " << top << " " << right << " " << botton << endl;}}}}cout << ans << endl;return 0;
}/*我的left right top botton && x y错乱了*/
历史遗留问题2–试题 基础练习 阶乘计算
试题 基础练习 阶乘计算
#include <stdio.h>
#include <iostream>
#include <string.h>using namespace std;int main() {int N;cin >> N;int mid[50] = {1};int mid_index = 0;
// string str = to_string(N);
// int length = str.length();for(int i = 1; i <= N; i++) {mid_index++;string s = to_string(i);int i_length = s.length();int i_arr[i_length + 5];memset(i_arr, '\0', sizeof(i_arr));int i_ = i;for(int j = 0; j < i_length; j++) {i_arr[j] = i_ % 10;i_ /= 10;}cout << "i_length= "<< i_length << endl;int mid_mid[50];memset(mid_mid, '\0', sizeof(mid_mid));for(int j = 0; j < i_length; j++) {for(int k = 0; k < mid_index; k++) {mid_mid[j + k] += mid[k] * i_arr[j];}}cout << mid_index << endl;for(int j = 0; j < mid_index + i_length - 1; j++) {cout << j << endl;if(mid_mid[j] > 9) {mid_mid[j + 1] += (mid_mid[j] / 10);mid[j] = mid_mid[j] % 10;}}if(mid_mid[mid_index + i_length - 1] != '\0') {mid[mid_index + i_length - 1] = mid_mid[mid_index + i_length - 1];mid_index = mid_index + i_length - 1;} else {mid_index = mid_index + i_length - 2;}cout << mid_index << endl;
//
// cout << mid_index << endl;}for(int i = mid_index; i >= 0; i--) {cout << mid[i];}return 0;
}
刷题
- 蓝桥杯22年初赛,做了一半,没全过,改天debug
- 试题 基础练习 特殊回文数
心得
- 不要轻易 /2, 第2题的血泪教训
小结
“业精于勤荒于嬉,行成于思毁于随”
小蒟蒻一个月,冲省一!