一只小蒟蒻备考蓝桥杯的日志
笔记
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。
我居然…一门心思把回文数找出来,结果是有策略的枚举
核心代码:
//ijkkji
if (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 decided
for(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题的血泪教训
小结
“业精于勤荒于嬉,行成于思毁于随”
小蒟蒻一个月,冲省一!