这一周,我们的团队进行了第二次刷题,6道题目对于团队的几个大佬来说不算太难,他们三下五除二,很快就有人6题通关了。真是厉害!但是这次似乎有几个题目超出了我这个菜鸟级的认知,好多高级的算法还没有学,甚至没有听说过。几个小时下来,忙了一身汗,依然分数惨淡。我真盼着快点学习D2、D3的课程。但是我还是对自己满意的,毕竟通过自己的努力还是作对了一部分。没做上的题目,我先通过看他们的博客,收藏起来,慢慢研究吧。下面我就把我刷的几道题觉得收获比较大的写写总结吧。
1、递归的妙用:比如在P1010 幂次方
这个题目中(题目要求不在赘述了)主要收获:递归方法的使用
因为刚刚学完了D1课程里的递归算法,觉得比较神奇,所以这道题我就尝试了一下,效果挺好。具体如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 void dg(int x){ 4 while(x>0){ 5 int zhishu=0,p=1; 6 while(x>=p*2){//找出比X小的最大的2的几次方的数。 7 p*=2; 8 zhishu++; 9 } 10 x-=p; 11 if(zhishu==0){//如果是0次方,直接输出。 12 cout<<"2("<<zhishu<<")"; 13 }else if(zhishu==1){//如果是1次方,也直接输出。 14 cout<<2; 15 }else{//否则,进入递归 16 cout<<"2("; 17 dg(zhishu); 18 cout<<")"; 19 } 20 if(x>0){//除了最后一位,其余输出“+". 21 cout<<"+"; 22 } 23 } 24 } 25 int main(){ 26 int n; 27 cin>>n; 28 dg(n); 29 return 0; 30 }
2、“难吃”的奶酪:P1433 吃奶酪
这道题目挺有意思的,就仔细研究起来,但是尝试了几种办法之后,都是失败。最后看了一位网上大佬的思路,豁然开朗,真是厉害。自己尝试着编写自己的代码。基本上样例输入输出都没问题,但就是最后一组数据总是超时超限,尝试修改了几次也是不行。看来还是那里没弄清楚。还请各位高手们多多指教啊。
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 using namespace std; 5 int n,l[1003]; 6 double sum; 7 double r[1003][1003]; 8 struct node{ 9 double x; 10 double y; 11 }zb[1003]; 12 void f(int zg,int sz,double cd){ 13 if(cd>sum){ 14 return; 15 } 16 if(zg==n){ 17 sum=min(sum,cd); 18 return; 19 } 20 for(int i=1;i<=n;i++) 21 if(!l[i]) 22 { 23 l[i]=1; 24 f(zg+1,i,cd+r[sz][i]); 25 l[i]=0; 26 } 27 } 28 int main(){ 29 scanf("%d",&n); 30 for(int i=1;i<=n;i++){ 31 scanf("%lf%lf", &zb[i].x, &zb[i].y); 32 } 33 zb[0].x=0; 34 zb[0].y=0; 35 for(int i=0;i<n;i++) 36 for(int j=i+1;j<=n;j++) 37 r[i][j]=r[j][i]=sqrt((zb[i].x-zb[j].x)*(zb[i].x-zb[j].x)+(zb[i].y-zb[j].y)*(zb[i].y-zb[j].y)); 38 sum=99999999.9; 39 f(0,0,0); 40 printf("%.2lf ",sum); 41 return 0; 42 return 0; 43 }
总结:加入团队一周的时间里,让我认识了很多大佬级的朋友,也学到了很多很多东西。真心佩服,他们真的太厉害了!我这几天也刷了不少题目。虽然有时候花费几个小时研究几道题,但是还是觉得收获颇丰,很开心。虽然我接触c++还不到一年,但是觉得编程还是挺神奇的。我也相信只要坚持学下去,我也一定会越来越厉害的。也期盼着能继续在团队里,向大家学习。