第十届蓝桥杯a组题解(部分)
注释:学校安排写蓝桥杯的题,就顺便写一下题解
1.平方和
枚举含有2,0,1,9的数,然后求其平方和
#include<bits/stdc++.h>
using namespace std;
int main(){
long long sum=0;
int flag=0;
for(int i=1;i<=2019;i++){
int j=i;
while(j){
if(j%10==2||j%10==0||j%10==1||j%10==9){
flag=1;
break;
}
j/=10;
}
if(flag) sum+=i*i;
flag=0;
}
cout<<sum<<endl;
}
2.数列求值
按题目要求写即可
#include<bits/stdc++.h>
using namespace std;
int a[20202020];
int main(){
a[1]=1;
a[2]=1;
a[3]=1;
a[4]=3;
for(int i=5;i<=20190324;i++){
a[i]=(a[i-1]+a[i-2]+a[i-3])%10000;
}
cout<<a[20190324];
}
3.最大降雨量
把49天分为7组,把大的数按顺序放到最后4位使得每列的中位数都较大最后答案是34
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<34<<endl;
}
4.迷宫
bfs的模板题,用一个结构体把要走的步数和字母都存起来
#include<bits/stdc++.h>
using namespace std;
char maps[501][501];
int vis[500][500];
char dic[4]={'D','L','R','U'};
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{
int x,y;
int step;
string path;
};
void bfs(){
queue<node>q;
node p;
p.x=0;
p.y=0;
p.step=0;
p.path="";
vis[0][0]=1;
q.push(p);
while(!q.empty()){
node p=q.front();
if(p.x==29&&p.y==49){
cout<<p.step<<endl;
cout<<p.path;
}
node v;
for(int i=0;i<4;i++){
v.x=p.x+dir[i][0];
v.y=p.y+dir[i][1];
if(v.x>=0&&v.y>=0&&v.x<30&&v.y<50&&vis[v.x][v.y]==0&&maps[v.x][v.y]!='1'){
vis[v.x][v.y]=1;
v.step=p.step+1;
v.path=p.path+dic[i];
q.push(v);
}
}
q.pop();
}
}
int main(){
memset(maps,'1',sizeof(maps));
memset(vis,0,sizeof(vis));
for(int i=0;i<30;i++){
for(int j=0;j<50;j++){
cin>>maps[i][j];
}
}
bfs();
return 0;
}
5.外卖店优先级
用一个pair存储外卖送到的时间和和外卖店的编号,用last数组储存编号为i的外卖店上一次收到外卖的时间,first数组储存进入优先缓存的外卖店编号,每次收到外卖时减去间隔的天数,最后到时间的时候再减去一次,看还有多少外卖店在优先缓存里
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000000
typedef long long ll;
pair<int,int >order[maxn];
ll n,m,t;
int ans[maxn];
ll last[maxn];
bool first[maxn];
int main(){
cin>>n>>m>>t;
for(int i=1;i<=m;i++){
cin>>order[i].first>>order[i].second;
}
sort(order+1,order+1+m);
for(int i=1;i<=m;i++){
int ts=order[i].first;
int id=order[i].second;
if(ts!=last[id]){
ans[id]=ans[id]-(ts-last[id]-1);
}
ans[id]=max(ans[id],0);
if(ans[id]<=3){
first[id]=false;
}
ans[id]+=2;
if(ans[id]>5){
first[id]=true;
}
last[id]=ts;
}
for(int i=1;i<=n;i++){
if(last[i]!=t){
ans[i]-=(t-last[i]);
if(ans[i]<=3){
first[i]=false;
}
}
}
ll res=0;
for(int i=1;i<=n;i++){
if(first[i]) res++;
}
cout<<res<<endl;
}
6.糖果
一道状压dp的题
存储每颗糖的口味,将所有可能的状态所对应的方案都记为-1,,用t来表示吃了某一包糖可获得的口味
状态转移方程意思时如果吃了这包糖可以达到的状态之前从来没有过,那到达这个状态所需要吃的糖数就等于不吃这颗糖的数目加一,如果吃这个糖后达到这个状态所需糖数目比原来少,就替换原来的数目
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[105][25];
int f[(1<<20)+5];
int main(){
ios::sync_with_stdio(false);
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++){
cin>>a[i][j];
}
int lim=1<<m;
for(int i=1;i<=(1<<m)-1;i++){
f[i]=-1;//可能达成i状态的方案数
}
for(int i=1;i<=n;i++){
int t=0;
for(int j=1;j<=k;j++) t|=1<<(a[i][j]-1);//吃掉第k包可以变成什么状态
int nt;
for(int st=0;st<lim;st++){
if(f[st]==-1) continue;//达不到这种状态
int nst=st|t;//吃掉这包糖果后可以达到的状态
if(f[nst]==-1||f[nst]>f[st]+1) f[nst]=f[st]+1;//计算达到该状态要吃的糖果数;
}
}
cout<<f[(1<<m)-1];
}