真题训练
目录
1.(5分)
2.(5分)
3.
4.(10分)
5.(15分)
6.(15分)
7.(15分)
8.(20分)
9.(25分)
问题描述
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到
40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。请问,在 1 到 n 中,所有这样的数的和是多少?
输入格式
输入一行包含两个整数 n。
输出格式
输出一行,包含一个整数,表示满足条件的数的和。
样例输入
40
样例输出
574
评测用例规模与约定
对于 20% 的评测用例,1 ≤ n ≤ 10。 对于 50% 的评测用例,1 ≤ n ≤ 100。对于 80% 的评测用例,1 ≤ n ≤ 1000。对于所有评测用例,1 ≤ n ≤ 10000。
在省赛是一个填空题,就是1到2019的平方和,存储这个平方和必须用long,不然int存储不了
#include
#include
bool judge(int n){
int t=n;
while(t>0){
int x=t%10;
if(x==2||x==0||x==1||x==9)
return true;
t=t/10;
}
return false;
}
int main() {
long long sum=0;
for(int i=1;i<=2019;i++){
if(judge(i)){
sum+=i*i;
}
}
std::cout<
这道题我看网上很多题解都是跑不了的,利用斐波那契迭代版可以快速解出,O(1)空间,O(n)时间
#include
int main(){
long int num1=1,num2=1,num3=1,num4=0;
long long i=3;
while(i<20190324){
num4=(num1+num2+num3)%10000;
num1=num2;
num2=num3;
num3=num4;
i++;
}
printf("%ld",num4);
return 0;
}
这题关键在于很多人做题会错误地用各种方法,或者是贪心的思想:(49+48+47+46+45+44+43),但是这种做法是错误的,因为求的是中位数,如果第二周的48是那一周的能量(中位数),那么就没有存在三张法术符大于48,所以
这道题不用编程就可以解决,
第一周:X X X 46 47 48 49(X代表只要比后四个数任意小就可以)
第二周:X X X 42 43 44 45
第三周:X X X 38 39 40 41
.....................
以此类推,很快就能得到(46+42+38+34+30+26+22)=238
直接暴力,但是可以回溯法(BFS)
下面的文章有完整解析
(2条消息) C++算法——BFS(图解)_隰有游龙的博客-CSDN博客_c++bfs
下面是大佬的代码
(2条消息) 第十届蓝桥杯 ——迷宫_业余算法学徒的博客-CSDN博客
#include
#include
#include
using namespace std;
typedef pair PII;
char g[30][50];
int dist[30][50];
char dir[] = {'D', 'L', 'R', 'U'};
int dx[] = {1, 0, 0, -1}, dy[] = {0, -1, 1, 0};
void bfs()
{
memset(dist, -1, sizeof dist);
queue q;
q.push({29, 49});
dist[29][49] = 0;
while(q.size())
{
PII t = q.front();
q.pop();
for (int i = 0; i < 4; i ++)
{
int a = t.first + dx[i], b = t.second + dy[i];
if(a < 0 || a >= 30 || b < 0 || b >= 50) continue;
if(g[a][b] == '1' || dist[a][b] != -1) continue;
q.push({a, b});
dist[a][b] = dist[t.first][t.second] + 1;
}
}
}
int main()
{
for (int i = 0; i < 30; i ++) cin >> g[i];
bfs();
string ans;
int x = 0, y = 0;
while(x != 29 || y != 49)
{
for (int i = 0; i < 4; i ++)
{
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= 30 || b < 0 || b >= 50) continue;
if(g[a][b] == '1') continue;
if(dist[x][y] == dist[a][b] + 1)
{
ans += dir[i];
x = a, y = b;
break;
}
}
}
cout << ans << endl;
return 0;
}
数学知识,做不出来。(2条消息) 蓝桥杯 RSA解密_林十六要努力的博客-CSDN博客_蓝桥杯rsa解密
完全二叉树(注意是完全二叉树而不是满二叉树,我第一次做就入坑,)
没明白为什么只过一个点。。
#include
#include
using namespace std;
int a[100002];
int x1[10000]={0};
int main(){
int n;
bool flag=0;
cin>>n;
int c=n/2;
if(n<(pow(2,c)-1)){
flag=1;
c=c-1;
}
int x=0;
int y;
for(int i=0;i>y;
a[i]=y;
}
x1[0]=a[0];
for(int i=0;imax){
max=x1[i];
maxindex=i+1;
}
}
cout<
标准代码:
#include
#include
using namespace std;
const int maxn=1e5+10;
int a[maxn];
long long b[maxn];
int main()
{
int n,i,k,j,flag;
long long ans,x;
ans=0;
k=1;
j=1;
x= -100000000000;
flag=0;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
ans+=a[i];
if(i==(pow(2,k)-1))
{
if(ans>x)
{
x=ans;
j=k;
}
ans=0;
k++;
flag=1;
}
flag=0;
}
if(flag==0&&(ans>x)) //当不是完全平衡二叉树的时候
{
j=k;
}
cout<
就模拟
我用pair+sort()超时,留个心眼吧
总结pair数组用法
typedef pair P;
pair timex[1000001];
bool cmp(P &s,P &b){
return s.first>t>>x;
timex[i]=make_pair(t,x);
}
sort(timex,timex+M,cmp);
cout<
vector删除用法(找出vector小于3的删除)
for(int i=0;i::iterator a=v.begin();a!=v.end();a++)
{
if(*a==v[i])
v.erase(a);
}
}
}
上面废话一堆
答案如下
#include
#include
using namespace std;
//顺带复习一下结构体的排序hhh
int m,n,t;
//store[id]第id号店上一次有的订单
//flag[id]存储第id号店在不在优先缓存中
//value[id]存储第id号店的得分
int store[100010],flag[100010],value[100010];
struct node{
int time,id;
}a[100010];
bool cmp(node a , node b){
if(a.id==b.id)
return a.time>n>>m>>t;
for(int i=0;i>a[i].time>>a[i].id;
}
sort(a,a+m,cmp);
for(int i=0;i5)
flag[id]=1;
store[id]=tt;
}
for(int i=1;i<=n;i++){
//如果这个店的最后一个订单不是第 t 分钟的
//就减去最后一个订单的时间到 t 时间之间应该减去的
if(store[i]
我的代码TLE了,只能捞部分分
注意vector的find是基于algorithm头文件实现的,我这种实现肯定很慢,用dp应该会很快
#include
#include
using namespace std;
vector s;
int main(){
int N,t;
cin>>N;
cin>>t;
s.push_back(t);
for(int i=0;i>t;
while(1){
vector::iterator it=find(s.begin(),s.end(),t);
if(it!=s.end()){
t++;
}
else{
s.push_back(t);
break;
}
}
}
for(int i=0;i
AC(是大佬的并查集)
(2条消息) 蓝桥杯 修改数组 【并查集】_可惜剑是断的的博客-CSDN博客_蓝桥杯修改数组
状态压缩dp
(2条消息) 2019蓝桥杯C++A组——糖果_芷汀若静的博客-CSDN博客_蓝桥杯糖果
十进制转二进制
看不懂状态压缩可以看这个教程
(2条消息) DP-状态压缩DP(解释+典例)_豆苗子的博客-CSDN博客_状态压缩dp
10.(25分)
难,题目都看不懂,可以自行百度搜索