事先声明,本蒟蒻第一次参加蓝桥杯,目标就是混分,嘿嘿,第一次参加,有点紧张(毕竟300块),代码写的比较乱,还请读者见谅,报的是省赛c++B组
我的答案:749(正确答案:1478)
签到题,但是,但是,我今天看dalao题解的时候才发现我做错了,裂开。。。。
后来看了自己的草稿才发现729少乘了2。哎,出师不利。
我的答案:5
这题争议比较大,有的认为是4,有的认为是14,在我看来,012不算顺子,321算顺子,所以我写的5,这题不管,题目出的不好哈哈。
我看完这道题目以后,没多思考,就直接暴力,也没想过会不会爆,看了dalao的题解说要先取余再暴力,本蒟蒻表示考试的时候想都没想,能混到分就万事大吉了哈哈
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long a,b,n;
scanf("%d %d %d",&a,&b,&n);
long long sum=0;
int temp=1,ans=0;
while(sum<n)
{
if(temp>=1 && temp<=5)
{
sum+=a;
}
else sum+=b;
temp++;
ans++;
if(temp>7)
{
temp-=7;
}
}
printf("%d\n",ans);
return 0;
}
这题刚开始我尝试着找规律,但没找到,然后就直接暴力做了,后来看了dalao的题解,确实可以用数学方法做,具体思想好像就是看当前这棵树距离两边的距离哪个大,然后用较大的那个距离乘2 就是该树能长到的最大高度了,本蒟蒻表示根本想不到,但其实暴力做也会碰到难处,就是你不知道什么时候跳出循环,这个我纠结了挺久,最后采用的方法是,循环50000次(迫不得已了哈哈),测试了10以内的数据,答案是对的,后面我也就不管啦,反正混分,混不到就算哈哈。
#include<iostream>
using namespace std;
int arr[10010];
int ans[10010];
int main()
{
int n;
cin>>n;
int index=1,index2=n-1;
int i,j;
int flag=50000;
int flag2=1;
while(flag--)
{
for(i=1;i<=n;i++ )
{
arr[i]++;
if(arr[i]>ans[i])
{
ans[i]=arr[i];
}
}
if(flag2==1 )
{
arr[index]=0;
index++;
}
else
{
arr[index2]=0;
index2--;
}
if(index>n || index2<1 )
{
flag2=-flag2;
index2=n-1;
index=2;
}
}
for(i=1;i<=n;i++ )
{
cout<<ans[i]<<endl;
}
return 0;
}
当时看到这道题就蒙了,本蒟蒻平时最讨厌和进制有关的题了,粗看了一眼题目,知道了个大概,应该是我不会做的题目,直接pass!
粗看题目,我的第一反应就是二维前缀和,然后一顿操作,发现应该没啥问题,然后就直接下一题了,考前刚好看了前缀和和差分数组这方面的知识,很幸运哈哈。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int arr[600][600];
int sum[600][600];
int n,m,k;
int ans;
void judge(int x,int y)
{
int p,q;
for(p=x ;p<=n;p++ )
{
for(q=y;q<=m;q++ )
{
if(sum[p][q]-sum[x-1][q]-sum[p][y-1]+sum[x-1][y-1]<=k) ans++;
}
}
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
int i,j;
for(i=1;i<=n;i++ )
{
for(j=1;j<=m;j++ )
{
scanf("%d",&arr[i][j]);
}
}
for(i=1;i<=n;i++ )
{
for(j=1;j<=m;j++ )
{
if(i==1 ) sum[i][j]=sum[i][j-1]+arr[i][j];
else if(j==1 ) sum[i][j]=sum[i-1][j]+arr[i][j];
else
{
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+arr[i][j];
}
}
}
for(i=1;i<=n;i++ )
{
for(j=1;j<=m;j++ )
{
judge(i,j);
}
}
cout<<ans<<endl;
return 0;
}
粗看这题,我想到了dp和卡特兰数,由于本蒟蒻刚学dp没多久,实在不会写转移方程,所以只能猜一下是不是卡特兰数,小试了前四组数据,发现和卡特兰数吻合,我也没多想,直接写。
#include<iostream>
using namespace std;
long long arr[10000100];
int main()
{
int n;
cin>>n;
int i,j;
arr[0]=1;
arr[1]=1;
for(i=2;i<=n;i++ )
{
for(j=0;j<i;j++ )
{
arr[i]+=(arr[j]*arr[i-j-1]%1000000007);
}
}
cout<<arr[n]<<endl;
return 0;
}
这道题,看了会题目,我的想法是深搜,加了一个visit数组判断炸雷是否已经炸了了(不知道算不算是记忆化)。
#include<iostream>
#include<cmath>
using namespace std;
typedef struct graph
{
int x;
int y;
int r;
}Graph;
Graph zha[10010];
Graph pai[10010];
int visit[10010];
int ans;
int n,m;
void dfs(int v)
{
visit[v]=1;
int i;
for(i=0;i<n;i++)
{
if((zha[v].x-zha[i].x)*(zha[v].x-zha[i].x)+(zha[v].y-zha[i].y)*(zha[v].y-zha[i].y)<=zha[v].r*zha[v].r && visit[i]==0 )
{
dfs(i);
}
}
return;
}
int main()
{
scanf("%d %d",&n,&m);
int i,j;
for(i=0;i<n;i++ )
{
cin>>zha[i].x>>zha[i].y>>zha[i].r;
}
for(j=0;j<m;j++ )
{
cin>>pai[j].x>>pai[j].y>>pai[j].r;
}
for(i=0;i<m;i++ )
{
for(j=0;j<n;j++ )
{
if((pai[i].x-zha[j].x)*(pai[i].x-zha[j].x)+(pai[i].y-zha[j].y)*(pai[i].y-zha[j].y)<=pai[i].r*pai[i].r && visit[j]==0)
{
dfs(j);
}
}
}
for(i=0;i<n;i++ )
{
if(visit[i]==1 ) ans++;
}
cout<<ans<<endl;
return 0;
}
由于时间不够了,最后两题我就浅浅看了一下,这题我大概觉得可以用dp或者dfs做?也不知道对不对,感觉自己也做不出来了哈哈
确认过眼神,是我做不出来的题,pass!
至此,我的第一次蓝桥杯就结束了,有遗憾,也有幸运,对于平时算法掌握的不算很好的我来说,这次比赛,更多意义上来算是督促自己去学习算法,在备考期间,我了解了一些很奇妙的算法,当然,也被算法折磨的很痛苦哈哈,不论结果如何,我从这次蓝桥学到了很多,有了比较多的收获,我想这些应该是比奖状更加有意义的哈哈,最后希望大家都能取得好成绩,本蒟蒻要继续努力学习算法了哈哈。