试题A:平方和
这题我没多想,直接进行暴力反正是道填空题 ,判断是否含有2,0,1,9即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
//别问为什么写四个,因为爱情~~习惯~~
using namespace std;
//防止溢出,结果保存在longlong里
typedef long long ll;
bool check(int n){
while(n){
if(n%10==2||n%10==0||n%10==1||n%10==9) return true;
n/=10;
}
return false;
}
int main(){
ll result=0;
for(int i=1;i<=2019;i++)
if(check(i))
result += i * i;
cout<<result<<endl;
return 0;
}
答案是:2658417853
试题B:数列求值
这题考的是斐波那契数列,个人感觉挺水,公式是:a[i]=a[i-1]+a[i-2]+a[i-3](有没有人和我一样跳坑里了呢)。是不是很暴力?是不是发现数组跑不出来了?哈哈哈。但我仔细一想,其实只用了四个变量,四个变量交换值就行。又有暴力那味儿了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int main(){
int a,b,c,d;
a=b=c=1;
for(int i=4;i<=20190324;i++){
d=(a+b+c)%10000;
a=b;
b=c;
c=d;
}
cout<<d<<endl;
return 0;
}
答案:4659
试题C:最大降雨量
这题我感觉考的是数学思维,首先要清楚中位数的定义,从小到大排,排在中间的那个数是中位数。
假设每一周的降雨量都是递增的,且每周的中位数也是递增的。(图中数字只是单元格的标记数,不是取值)
那么答案就是中位数的中位数,也就是图中背景颜色为红色的方格。按照中位数的概念,35,36,37这三个单元格一定比34大,38-49号单元格也一定比34号单元格大,空白部分随意填写。所以34号单元格是这16个格子中最小的。带点贪心的思想,那么第34号单元格的值为49-16+1=34.***(答案和标记相等纯属巧合)***
答案:34
试题D:迷宫
测试集:
01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000
迷宫题,常规思路BFS。代码走你┏ (゜ω゜)=☞。
这题主要的坑在于上下左右的方向问题。
假设当前点位(1,1),那么向左挪动就变成(1,0),向右挪动变成(1,2),向上挪动变成(0,1),向下挪动变成(2,1)。并不是传统挪动上,左右挪动移动x,上下挪动移动y。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct node{
int x,y;
string line;
};
int map[50][50];
string line[50];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
char dl[4]={'L','R','U','D'};
int main(){
for(int i=0;i<30;i++){
cin>>line[i];
}
for(int i=0;i<30;i++)
for(int j=0;j<50;j++){
map[i][j]=line[i][j]-'0';
}
queue<node> q;
node head,next;
head.x=0;
head.y=0;
head.line="";
map[head.x][head.y]=1;
q.push(head);
while(!q.empty()){
head=q.front();
q.pop();
if(head.x==29&&head.y==49){
cout<<head.line<<endl;
return 0;
}
for(int i=0;i<4;i++){
next.x=head.x+dx[i];
next.y=head.y+dy[i];
next.line=head.line+dl[i];
if(next.x<0||next.x>=30||next.y<0||next.y>=50) continue;
if(map[next.x][next.y]==1) continue;
map[next.x][next.y]=1;
q.push(next);
}
}
return 0;
}
我的BFS就是很常规的C++模板类型,可能不够简便。望各位大牛下手轻点
答案:DDDDRRURRRRRRRDRRRDDDLDDRDDDDDDDDDDDDRDRDRRURRUURRDDDDRDRRRRRRURRDRRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDRDRRRRDRDRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
试题E:RSA解密
说实话,这题我挺无语的,正常CTF解密的我就直接掏出工具了。没想到沦落到写代码了。看似是模拟,但是我不会,哈哈哈哈哈。是孩子太菜了。
试题F:完全二叉树的权值
完全二叉树啦,直接数组存储就行啦。并不想太多解释。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=100010;
int n,value;
int sum[N];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>value;
int tmp = log2(i) + 1;
sum[tmp]+=value;
}
int length = log2(n)+1;
int maxn=0,minn=0;
for(int i=1;i<=length;i++){
if(sum[i]>maxn){
maxn=sum[i];
minn=i;
}
}
cout<<minn<<endl;
return 0;
}
试题G:外卖优先级
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N=1e5+10;
PII order[N];
int score[N],last[N];
bool st[N];
int main(){
int n,m,t;
cin>>n>>m>>t;
for(int i=0;i<m;i++) scanf("%d%d",&order[i].x,&order[i].y);
sort(order,order+m);
for(int i=0;i<m;){
int j=i;
while(j<m&&order[j]==order[i]) j++;
int t=order[i].x,id=order[i].y,cnt=j-i;
i=j;
score[id]-=t-last[id]-1;
if(score[id]<0) score[id]=0;
if(score[id]<=3) st[id]=false;
score[id]+=cnt*2;
if(score[id]>5) st[id]=true;
last[id]=t;
}
for(int i=1;i<=n;i++)
if(last[i]<t){
score[i]-=t-last[i];
if(score[i]<=3) st[i]=false;
}
int res=0;
for(int i=1;i<=n;i++) res+=st[i];
cout<<res<<endl;
return 0;
}
后期还会继续更新,敬请期待。