2024/1/30 周二
平方和
【参考代码】
#include <iostream>
using namespace std;
int ok(int n) // 判断有没有数位中有没有2 0 1 9
{
int tmp;
while(n)
{
tmp = n % 10;
if(tmp == 2 || tmp == 0 || tmp == 1 || tmp == 9)
{
return 1;
break;
}
n /= 10;
}
return 0;
}
int main()
{
// 请在此输入您的代码
long long squaresum = 0; // 平方和太大,用long long接
for(int i=1; i<= 2019; i++)
{
if(ok(i))
squaresum += i * i;
}
cout << squaresum;
return 0;
}
门牌制作
【参考代码】
#include <iostream>
using namespace std;
int res = 0;
void solve(int n)
{
while(n)
{
if(n % 10 == 2)
res++;
n /= 10;
}
}
int main()
{
for(int i=2; i<=2020;i++)
{
solve(i);
}
cout << res;
return 0;
}
卡片
【参考代码】
#include <iostream>
using namespace std;
int a[10] = {2021, 2021,2021,2021,2021,2021,2021,2021,2021,2021};
int reducecards(int n)
{
while(n)
{
int index = n % 10;
if(a[index] == 0)
return 0;
a[index]--;
n /= 10;
}
return 1;
}
int main()
{
for(int i=1; i<4000; i++)
{
if(reducecards(i) == 0)
{
cout << --i; // 循环的特性, 最后3182是不能拼出来的,只能从1拼到3181
break;
}
}
return 0;
}
分数
【参考代码】
#include <iostream>
using namespace std;
int main()
{
// 样例3/2就可以推出来计算方法了
int mole = 1; //分子
int deno = 1; //分母
for(int i=1;i<20;i++)
{
deno *= 2;
mole += deno;
}
cout << mole << "/" << deno;
return 0;
}
星期一
【参考代码】
#include <iostream>
using namespace std;
int f(int year) //判断闰年
{
if( (year%4==0 && year%100!=0) || year % 400==0)
return 1;
else
return 0;
}
int main()
{
int sum=0,i;
for(i = 1901; i <= 2000; i++)
sum += 365 + f(i); //算出这100年有多少天
cout << sum / 7; //除以7就是答案
return 0;
}
魔方状态(不推荐做)
太麻烦了,连老师都做不出来,倒不如放弃去做自己会的
下面是老师的思路点拨:
倪文迪陪你学蓝桥杯2021寒假每日一题:1.5日(2017省赛A第3题)_7个角块排列的时候,只有6格角块可以自由选择方向-CSDN博客
cout << 229878; 填空题,输出答案即可
2024/1/31 周三
顺子日期
【思路和参考代码】
简单的数学枚举问题,一开始算出来3,结果不对
可用的顺子:0 1 2, 1 2 3
顺子日期:01.20~01.29 10个 11.23\10.12\12.30\12.31 4个
printf("14");
最少砝码
【思路和参考代码】
由于测试点太大,必须得找到规律,要列举例子才能找出来本质的规律
第十二届蓝桥杯省赛JavaB组 试题 G: 最少砝码_你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 n c-CSDN博客
Code:
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
// 1 3 9 ... n^3
int n;
cin >> n;
int cnt = 1;
long long weight = 3, sum = 1;
n--;
while(n >= sum)
{
cnt++;
sum += weight;
weight *= 3; //负责n^3
}
cout << cnt;
return 0;
}
成绩分析
【参考代码】
没什么难的,C++保留两位小数点太麻烦(要写头文件),直接用printf方便
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
//int a[10005];
double sum = 0;
int n, tmp;
int x = 1 << 10, y = -1; //1右移10位=1024
cin >> n;
for(int i=0;i<n;i++)
{
cin >> tmp;
sum += tmp;
y = max(y, tmp);
x = min(x, tmp);
}
cout << y << endl;
cout << x << endl;
printf("%0.2lf", sum/n);
return 0;
}
合法日期
【参考代码】
#include <iostream>
using namespace std;
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
int flag = 1; //合法
int m, d;
cin >>m>>d;
if(m > 12)
flag = 0;
if(d > mon[m])
flag = 0;
cout << (flag ? "yes" : "no");
// if(flag)
// cout << "yes";
// else
// cout << "no";
return 0;
}
时间加法
【参考代码】
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int a,b,t;
cin>>a>>b >> t;
b = b + t;
if(b >= 60)
{
int tmp = b / 60;
b = b - tmp * 60;
a = tmp + a;
}
if(a >= 24)
{
a = a - 24;
}
cout << a << "\n" << b;
return 0;
}
注意0点的判断就行
扫雷
【参考代码】
#include <iostream>
using namespace std;
int a[100][100];
int n,m;
int solve(int x,int y) //笨方法了,本来想用dfs
{
int cnt = 0;
if(a[x-1][y-1] == 1)
cnt++;
if(a[x-1][y] == 1)
cnt++;
if(a[x-1][y+1] == 1)
cnt++;
if(a[x][y-1] == 1)
cnt++;
if(a[x][y+1] == 1)
cnt++;
if(a[x+1][y-1] == 1)
cnt++;
if(a[x+1][y] == 1)
cnt++;
if(a[x+1][y+1] == 1)
cnt++;
return cnt;
}
int main()
{
cin >>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin >> a[i][j];
}
}
for(int i=0;i<n;i++)
{
int cnt = 0;
for(int j=0;j<m;j++)
{
if(a[i][j] == 1)
cout << 9 <<" ";
else
{
cout << solve(i,j) << " ";
}
}
cout << "\n";
}
return 0;
}
最大运行时间只有1s,怕超时所以只用了一个二维数组(用两个有三个二重循环)
下面是solve函数的判断,cnt记得要清零
大写
【参考代码】
大写字母 比 小写字母小32
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 请在此输入您的代码
string s;
cin >> s;
int n = s.size(); //长度
for(int i=0; i<n;i++)
{
if(s[i] >= 65 && s[i] <= 90)
cout << s[i];
else
{
s[i] = s[i] - 32; // 大写字母 比 小写字母小32
cout << s[i];
}
}
return 0;
}
2024/2/1 周四
标题统计
【参考代码】
getline函数是读取一行字符串,遇到‘\n’换行符停止
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 请在此输入您的代码
string s;
getline(cin,s);
int n = s.size();
int cnt=0;
for(int i=0;i<n;i++)
{
if(s[i] == '\n' || s[i] == ' ')
continue;
else
cnt++;
}
cout << cnt;
return 0;
}
求和
【参考代码】
#include <iostream>
using namespace std;
int sum = 0;
void solve(int n)
{
int tmp = n;
while(tmp)
{
if(tmp % 10 == 2 || tmp % 10 == 0 || tmp % 10 == 1 || tmp % 10 == 9)
{
sum += n;
break;
}
tmp /= 10;
}
}
int main()
{
// 请在此输入您的代码
for(int i=1;i<=2019;i++)
{
solve(i);
}
cout << sum;
return 0;
}
修剪灌木
【思路和参考代码】
哈哈,还是个简单题,写了半天都不知道4怎么来的,看题解才知道是傍晚剪之前长到了4。然后找数量关系,感觉这些模拟题目的就是找数量关系。这题的数量关系其实是“某个点草长到最大高度等于他右边最长边的二倍”
#include <iostream>
using namespace std;
int main()
{
//某个点草长到最大高度等于他右边最长边的二倍
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
cout << max(i-1,n-i) * 2 <<endl;
}
return 0;
}
写代码要啸着写
天数
【参考代码】
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int mon[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int n;
cin >>n;
cout << mon[n];
return 0;
}
最大间隙
【参考代码】
每两个数的差值都不同,要逐一找出
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
// 请在此输入您的代码
int jianxi = 1 >> 30;
int a[1005];
int n;
cin >>n;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for(int i=1;i<n;i++)
{
jianxi = max(jianxi, abs(a[i]-a[i-1]));
}
cout << jianxi;
return 0;
}
金币
【参考代码】
#include <iostream>
using namespace std;
int main()
{
// 1000元是发不完1000天的,发到1000元的时候天数不够1000天
int n;
double sum = 0;
cin >>n;
int a=0,b=1;
while(n > 0)
{
if(n - b < 0)
break;
n = n-b;
b++;
}
for(int i=1;i<b;i++)
{
sum += i * i;
}
sum += n * b;
cout << sum;
return 0;
}
明明的随机数
【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
// 请在此输入您的代码
int n;
int a[100] = {0};
cin >> n;
for(int i=0;i<n;++i)
{
cin >> a[i];
}
sort(a,a+n);
int cnt = 0;
for(int i=0;i<n;i++)
{
if(a[i] == a[i+1] && a[i] != 0)
cnt++;
}
cout << n-cnt << endl;
//为什么不能用 n-cnt
//不输出重复元素而已,不代表重复元素不在数组中
for(int i=0;i<n;++i)
{
if(a[i] != a[i+1])
cout << a[i] << " ";
}
return 0;
}
灌溉
【参考代码】
类似扫雷题
#include <iostream>
using namespace std;
int f[100][100];
int n,m;
void water(int x,int y)
{
//if(x!=0)
f[x-1][y] = 1;
f[x+1][y] = 1;
f[x][y-1] = 1;
f[x][y+1] = 1;
}
int main()
{
// 请在此输入您的代码
int tube;
cin >> n >> m >> tube;
for(int i=0;i<tube;i++)
{
int a,b;
cin >>a>>b;
f[a][b] = 1;
}
int k;
cin >>k;
for(int i=0;i<k;i++)
{
for(int a=0;a<n;a++)
{
for(int b=0;b<m;b++)
{
if(f[a][b] == 1)
water(a,b);
}
}
}
int cnt = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(f[i][j] == 1)
cnt++;
}
}
cout << cnt;
return 0;
}
天干地支
【参考代码】
2019年:己亥 2021年:辛丑。以2020作为基准
#include <iostream>
using namespace std;
int main()
{
// 2019年:己亥 2021年:辛丑。以2020作为基准
int n;
cin >>n;
string a[10] = {"geng", "xin", "ren", "gui", "jia", "yi" , "bing", "ding", "wu", "ji"};
string b[12] = {"shen", "you", "xu", "hai", "zi", "chou", "yin", "mou", "chen", "si", "wu", "wei"};
cout << a[n%10] << b[n%12];
return 0;
}
2024/2/2 周五
最大距离
【参考代码】
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
// 请在此输入您的代码
int a[1005];
int n;
cin >>n;
for(int i=1;i<=n;i++)
{
cin>> a[i];
}
int res = -1;
// j = n;
for(int i=1;i<=n;i++)
{
for(int j=2;j<=n;j++)
res = max(res, abs(i-j)+abs(a[i]-a[j]));
}
cout << res;
return 0;
}
特殊日期
【参考代码】
最骚操作就是这个2月的天数可以修改
//cout << 70910;
#include <iostream>
#include <algorithm>
using namespace std;
int fun(int n)
{
int sum = 0;
while(n)
{
sum += n % 10;
n /= 10;
}
return sum;
}
int leapyear(int y)
{
if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
return 1;
return 0;
}
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
// 请在此输入您的代码
int cnt = 0;
for(int i=1900;i<=9999;i++)
{
if(leapyear(i))
mon[2] = 29;
else
mon[2] = 28;
for(int j=1;j<=12;j++)
{
for(int k=1;k<=mon[j];k++)
if(fun(i) == fun(j) + fun(k))
cnt++;
}
}
cout << cnt;
return 0;
}
最长递增
【参考代码】
动态规划:
#include <iostream>
using namespace std;
int a[1001], f[1001];
//dp花了老子15分钟,不值得
int main()
{
// 请在此输入您的代码
int n ;
cin>>n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
f[1] = 1;
for(int i=2;i<=n;i++)
{
f[i] = 1;
if(a[i-1] < a[i])
f[i] = f[i-1] + 1;
else
f[i] = 1;
}
int res = -1;
for(int i=1;i<=n;i++)
{
res = max(res, f[i]);
}
cout << res;
return 0;
}
模拟做法:和动态规划思路差不多——来自andy的代码
#include<stdio.h>
int main() {
int n;
int a,b;
int count = 1,len=1;
scanf("%d", &n);
scanf("%d", &a);
for (int i = 1;i < n;i++) {
scanf("%d", &b);
if (b > a)
count++;
else
count = 1;
if (count > len)
len = count;
a = b;
}
printf("%d", len);
return 0;
}
串的处理
【参考代码】
用的string的成员函数,下划线找到位置先输出,空格其实可以忽略输出
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 请在此输入您的代码
string s;
getline(cin,s);
int n = s.size();
for(int i=0;i<n;i++)
{
//排除空格后是数字的情况,空格后是字母才要变大写
if( (i==0 || s[i-1] == ' ') && (s[i] >= 'a' && s[i] <= 'z') )
s[i] = s[i] - 32;
if( ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) && (s[i+1] >= '0' && s[i+1] <= '9') )
{
s.insert(i+1,"_"); //string常用的成员函数insert(), append()
continue;
}
if( ((s[i+1] >= 'a' && s[i+1] <= 'z') || (s[i+1] >= 'A' && s[i+1] <= 'Z')) && (s[i] >= '0' && s[i] <= '9') )
{
s.insert(i+1,"_"); //在i+1的位置插入_
continue;
}
if(s[i] == ' ' && s[i+1] == ' ')
{
s.erase(i,1); //删除第i位置上的一个字符
--i; //删除之后,所有字符会向前移动一位,自动i+1,需要后退一步
}
}
cout << s;
return 0;
}
ISBN号码
【参考代码】
写复杂咯
#include <stdio.h>
int main(){
char arr[15] = { 0 };
int num[10]= { 0 };//存放数字
scanf("%s", &arr);
int i;
int j = 0;
//去掉减号,只留数字
for( i=0; i<15; i++)
{
if( arr[i] == '-' )
continue;
else
{
num[j] = ( arr[i] - '0');
j++;
}
}
//计算每位校验码
int sum = 0; j = 1;
for( i=0; i<9; i++)
{
sum += num[i] * j;
j++;
}
sum = sum % 11;
if(sum == 10) //为X的情况
{
if(arr[12] == 'X')
{
printf("Right");
return 0;
}
arr[12] = 'X';
//打印正确校验码
for( i=0; ( arr[i] )!='\0'; i++)
printf("%c", arr[i] );
return 0; //结束程序
}
//判断最后一位数字是否正确
if( sum == num[9] )
printf("Right");
else
{
for( i=14; i>0; i--)
{
if( arr[i] != 0 )
{
sum = sum + 48;//数字转ASCII码值,变成字符数字
arr[i] = sum;
break;
}
}
//打印正确校验码
for( i=0; ( arr[i] )!='\0'; i++)
printf("%c", arr[i] );
}
return 0;
}
缩位求和
【参考代码】
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 请在此输入您的代码
string s;
cin>>s; //字符串
int sum = 0;
for(int i=0;i<s.size();i++)
{
int n = s[i] - '0'; //字符转数字
while(n)
{
sum += n % 10;
if(sum >= 10)
{
sum = sum/10 + sum%10;
}
n /= 10;
}
}
cout << sum;
return 0;
}
幸运数字
【参考代码】
#include <iostream>
using namespace std;
int f(int n, int j)
{
int sum = 0;
while(n)
{
sum += n % j;
n /= j;
}
return sum;
}
int main()
{
// 请在此输入您的代码
int i=1, cnt=0;
for(;cnt<2023;i++)
{
if(i % f(i,2) == 0 && i % f(i,8) == 0 && i % f(i,10) == 0 && i % f(i,16) == 0)
{
cnt++;
}
}
cout << i-1;
return 0;
}
2024/2/3 周六
幸运数
【参考代码】
cout << 4430091;
//参考罗勇军老师代码
#include <iostream>
#include <string>
using namespace std;
int ans = 0;
int shuwei(long long n)
{
int sum = 0;
while(n)
{
n /= 10;
sum++;
}
return sum;
}
int fun(long long n)
{
int length = shuwei(n);
if(length % 2 != 0)
return 0;
int a[10] = {0}, i=0;
while(n)
{
a[i] = n % 10;
n/=10;
i++;
}
int sum1=0, sum2=0;
for(int i=0;i<length/2;i++)
{
sum1 += a[i];
sum2 += a[i+length/2];
}
return sum1 == sum2; //双等号判断,返回1
}
int main() {
for(int i=1;i<=99999999;i++)
{
if(fun(i))
ans++;
}
cout << ans;
return 0;
}
有奖问答
【参考代码】
#include <iostream>
using namespace std;
int res = 0; //一开始以为是组合数,看看题目不对劲
void dfs(int test, int score)
{
if(score == 100) //100分结束
return;
if(score == 70) //计数
res++;
if(test == 30) //结束条件30题,第30题的时候可能就答对了,不能放在res前面
return;
dfs(test+1, 0); //答错一题全部分数为0
dfs(test+1, score+10); //答对加10分
}
int main()
{
//dfs(0, 0);
cout << 8335366;
}
分糖果
【参考代码】
#include <iostream>
using namespace std;
int ans = 0;
void dfs(int child, int candy1, int candy2)
{
//结束条件:当child为7,且两种糖果数量为0
if(child == 7)
{
if(candy1 == 0 && candy2 == 0)
{
ans++;
return;
}
}
for(int i=0;i<=candy1;i++) //枚举发的candy1数量
{
for(int j=0;j<=candy2;j++) //枚举发的candy2数量
{
if(i+j >= 2 && i+j <= 5)
dfs(child+1, candy1-i, candy2-j);
}
}
}
int main()
{
//dfs(0, 9, 16); // 人 candy1 candy2
cout << 5067671;
return 0;
}
工作时长
【参考代码】
用Excel表来做是一种非常新奇的思路,不会用Excel就只能写代码了
即使时间被打乱了,仍然可以转换为时间戳,利用时间戳的特性
#include <iostream>
using namespace std;
int main()
{
// 用Excel表来做是一种非常新奇的思路,不会用Excel就只能写代码了
cout << 5101913;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int year, month, day, h, m, s;
vector<int> days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
vector<int> v;
int main() {
// 将输入时间换算成距离 `2022-01-01 00:00:00` 的秒数
// 只要成功读取了6个数值,继续循环
while (scanf("%d-%d-%d %d:%d:%d", &year, &month, &day, &h, &m, &s) == 6)
{
int sum = 0;
for (int i = 1; i < month; ++i) //即使时间被打乱了,仍然可以转换为时间戳,利用时间戳的特性
sum += days[i]; //某月份的全部天数
sum += day;
sum = sum * 24 + h; //1天24h
sum = sum * 60 + m; //1小时60m
sum = sum * 60 + s; //1分钟60s
v.push_back(sum);
}
// 将换算成秒数后的时间按升序排序
sort(v.begin(), v.end());
int ans = 0;
// 相邻的每对时间,即为一次上班和下班的打卡记录。求每对的时间差再求和,就是小蓝2022年度的工作时长
for (int i = 0; i < v.size(); i += 2) {
ans += v[i + 1] - v[i];
}
cout << ans;
return 0;
}
求和
【参考代码】
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
cout << 204634714038436;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
long long sum = 0;
for(int i=1;i<=20230408;i++)
sum += i;
cout<<sum;
return 0;
}