当前位置:   article > 正文

牛客小白月赛59题解(完整版)_弹珠碰撞 弹珠活动编程华为

弹珠碰撞 弹珠活动编程华为

A-我会开摆_牛客小白月赛59 (nowcoder.com)

思路:对于每一个位置,判断其右边,下边,右下边位置是否满足就行。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void solve()
  4. {
  5. char a[4][4];
  6. for(int i=0;i<4;i++)
  7. scanf("%s",a[i]);
  8. int ans=0;
  9. for(int i=0;i<3;i++)
  10. {
  11. ans=0;
  12. for(int j=0;j<3;j++)
  13. {
  14. if(a[i][j]==a[i][j+1]&&a[i][j]==a[i+1][j]&&a[i][j]==a[i+1][j+1])
  15. {
  16. cout<<"Yes\n";
  17. return ;
  18. }
  19. }
  20. }
  21. cout<<"No\n";
  22. return ;
  23. }
  24. int main()
  25. {
  26. int t;
  27. cin>>t;
  28. while(t--)
  29. {
  30. solve();
  31. }
  32. return 0;
  33. }

总结:读题要认真、仔细一点。

B-走廊的灯_牛客小白月赛59 (nowcoder.com)

思路:思维题,当i大于等于2的时候,对于每一个位置,如果说前面那个和和当前这个状态满足同一个条件,就加1,否则,直接赋值为0就行,遍历所有位置,找到最大值。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void solve()
  4. {
  5. int n;
  6. string s;
  7. cin>>n>>s;
  8. //最长有多少盏灯不包含亮着的或者是不包含灭了的
  9. int dp1[100010]={0},dp2[100010]={0};
  10. s=' '+s;
  11. if(s[1]=='0') dp1[1]=1;
  12. else if(s[1]=='1') dp2[1]=1;
  13. else dp1[1]=1,dp2[1]=1;
  14. for(int i=2;i<=n;i++)//一直到第i号位的时候最长是多少
  15. {
  16. if(s[i]=='0')//如果说当前是灭的
  17. {
  18. dp1[i]=dp1[i-1]+1;
  19. dp2[i]=0;
  20. }
  21. else if(s[i]=='1')
  22. {
  23. dp1[i]=0;
  24. dp2[i]=dp2[i-1]+1;
  25. }
  26. else
  27. {
  28. dp1[i]=dp1[i-1]+1;
  29. dp2[i]=dp2[i-1]+1;
  30. }
  31. }
  32. int ans=-1;
  33. for(int i=1;i<=n;i++)
  34. ans=max(ans,max(dp1[i],dp2[i]));
  35. cout<<ans<<endl;
  36. return ;
  37. }
  38. int main()
  39. {
  40. int t;
  41. cin>>t;
  42. while(t--) solve();
  43. return 0;
  44. }

总结:就思维题 。多想想。

 C-输出练习_牛客小白月赛59 (nowcoder.com)

 思路:看数据范围,最大的时间复杂度也只是当k=2的时候,循环63次不到,最大也就是63*10的四次方。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int t;
  5. ll l,r,k;
  6. int main()
  7. {
  8. ios::sync_with_stdio(false);
  9. cin.tie(0);cout.tie(0);
  10. cin>>t;
  11. while(t--)
  12. {
  13. cin>>l>>r>>k;
  14. vector<ll>ans;
  15. bool f=false;
  16. if(k==0ll)
  17. {
  18. ans.push_back(0);
  19. ans.push_back(1);
  20. }
  21. else if(k==1ll) ans.push_back(1);
  22. else
  23. {
  24. ll a=k;
  25. ans.push_back(1);
  26. ans.push_back(k);
  27. while(a<=r/k)//防止a爆long long
  28. {
  29. a*=k;
  30. ans.push_back(a);
  31. }
  32. }
  33. for(auto x:ans)
  34. {
  35. if(x>=l&&x<=r)
  36. {
  37. cout<<x<<' ';
  38. f=true;
  39. }
  40. }
  41. if(!f) cout<<"None.\n";
  42. else cout<<endl;
  43. }
  44. return 0;
  45. }

总结:重点就是对于时间复杂度的计算,别看到2的63次方就慌了。其次就是在对极限,也就是最大值的处理上,要注意,不能爆long long ,重点,提前预算一下。

 D-国际象棋_牛客小白月赛59 (nowcoder.com)

 思路:在每一次棋子的时候都判断一下是否满足K子连珠了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1010;
  4. int book[N],a[N][N],n,m,k;
  5. bool check(int x,int y)
  6. {
  7. int t=a[x][y],count=0,i=y,j;
  8. if(y>=k)
  9. {
  10. while(i>0)
  11. {
  12. if(a[x][i--]==t) count++;
  13. else break;
  14. }
  15. }
  16. if(count>=k) return true;
  17. else count=0;
  18. i=x;
  19. while(i>0)
  20. {
  21. if(a[i--][y]==t) count++;
  22. else break;
  23. }
  24. i=x+1;
  25. while(i<=m)
  26. {
  27. if(a[i++][y]==t) count++;
  28. else break;
  29. }
  30. if(count>=k) return true;
  31. else count=0;
  32. i=x,j=y;
  33. while(i>0&&j>0)
  34. {
  35. if(a[i--][j--]==t) count++;
  36. else break;
  37. }
  38. if(count>=k) return true;
  39. else count=0;
  40. i=x+1,j=y+1;
  41. while(i<=n&&j<=m)
  42. {
  43. if(a[i++][j++]==t) count++;
  44. else break;
  45. }
  46. if(count>=k) return true;
  47. else count=0;
  48. i=x,j=y;
  49. while(i>0&&j<=m)
  50. {
  51. if(a[i--][j++]==t) count++;
  52. else break;
  53. }
  54. i=x+1;j=y-1;
  55. while(i<=n&&j<=m)
  56. {
  57. if(a[i++][j--]==t) count++;
  58. else break;
  59. }
  60. if(count>=k) return true;
  61. else return false;
  62. }
  63. int main()
  64. {
  65. int t,zi;
  66. cin>>n>>m>>k>>t;
  67. for(int i=1;i<=t;i++)
  68. {
  69. cin>>zi;
  70. a[zi][++book[zi]]=i%2+1;
  71. if(check(zi,book[zi]))
  72. {
  73. cout<<i<<endl;
  74. return 0;
  75. }
  76. }
  77. }

总结:认真读题,先把题目读懂。

E-弹珠碰撞_牛客小白月赛59 (nowcoder.com)

 思路:两个球发生碰撞,则交换位置,交换位置球走的位置就相当于和他碰撞的那个球本来不碰撞需要走的位置,我们可以直接让所有的球都沿他们自己的方向去走就好了,但是并不会影响最后一个球出界的时间。所以我们只需要与处理一下每一个位置后面或者是前面和自己方向不一样的球的数量就好了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=2e6+7;
  5. int dir[N],pre[N],last[N],pos[N];
  6. int n,m;
  7. int main()
  8. {
  9. cin>>n>>m;
  10. for(int i=1;i<=m;i++) cin>>dir[i];
  11. for(int i=1,x;i<=m;i++)
  12. {
  13. cin>>x;
  14. pos[x]=(dir[i]==0?-1:1);
  15. }
  16. for(int i=1;i<=n;i++)
  17. pre[i]=pre[i-1]+(pos[i]==1?1:0);
  18. for(int i=n;i>=1;i--)
  19. last[i]=last[i+1]+(pos[i]==-1?1:0);
  20. int res=0;
  21. for(int i=1;i<=n;i++)
  22. {
  23. if(pos[i]==1)
  24. res=max(res,n-i+last[i]+1);
  25. else if(pos[i]==-1)
  26. res=max(res,i+pre[i]);
  27. }
  28. cout<<res<<endl;
  29. return 0;
  30. }

总结:找规律,不用太纠结于过程是怎么样执行的,化繁为简。

F-困难卷积_牛客小白月赛59 (nowcoder.com)

思路:结论题目: 如果说b数组的和小于等于n,那么数组的种类数不会超过sqrt(n)!

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int main()
  5. {
  6. int n;
  7. cin>>n;
  8. //如果说b数组的和小于等于n,那么数组的种类数不会超过sqrt(n)!
  9. map<ll,ll>mp1;
  10. map<ll,ll>mp2;
  11. int a;
  12. for(int i=1;i<=n;i++)
  13. {
  14. cin>>a;
  15. mp1[a]++;
  16. }
  17. for(int j=1;j<=n;j++)
  18. {
  19. cin>>a;
  20. mp2[a]++;
  21. }
  22. ll sum=0;
  23. for(auto i:mp1)
  24. for(auto j:mp2)
  25. sum+=(i.second*j.second)*(ll)sqrt(abs(i.first-j.first));
  26. cout<<sum<<endl;
  27. return 0;
  28. }

总结:结论题目,记住结论,减少时间复杂度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/274780
推荐阅读
相关标签
  

闽ICP备14008679号