当前位置:   article > 正文

牛客周赛 Round 51

牛客周赛 Round 51

目录

A.小红的同余

B.小红的三倍数 

C.小红充电 

D.小红的gcd 

 E.小红走矩阵

F.小红的数组 


这次周赛题目比较简单,算法题也基本上是板子题,出得很好(~ ̄▽ ̄)~

 

A.小红的同余

思路:签到题,别看成逆元题就行 

  1. #include<iostream>
  2. #define int long long
  3. using namespace std;
  4. int32_t main()
  5. {
  6. int m;cin>>m;
  7. cout<<(m+1)/2;
  8. }

B.小红的三倍数 

思路:签到题,如果这个数能被三整除,则这个数每一位的数相加得到的和也能被三整除

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;cin>>n;
  7. int sum=0;
  8. for(int i=0;i<n;i++)
  9. {
  10. string s;cin>>s;
  11. for(int j=0;j<s.size();j++)
  12. {
  13. sum+=s[j]-'0';
  14. }
  15. }
  16. if(sum%3==0)
  17. puts("YES");
  18. else puts("NO");
  19. }

C.小红充电 

 

思路:总共分两种情况讨论:

            ①  x<=t 时使用超级快充即可

            ②  x>t 时,计算先玩到电量为t时启用超级快充更快还是直接充电更快

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. double x,y,t,a,b,c;cin>>x>>y>>t>>a>>b>>c;
  6. if(x<=t)
  7. {
  8. printf("%.9lf",(100*1.0-x)/c);
  9. }
  10. else
  11. {
  12. double wan=x-t;
  13. double t1=1.0*wan/y;//这个地方分母要乘1.0
  14. double t2=(100*1.0-t)/c;
  15. double t3=(t1+t2);
  16. double t4=(100*1.0-x)/b;
  17. printf("%.9lf",min(t3,t4));
  18. }
  19. }

D.小红的gcd 

思路:可以迭代线性遍历a,来求解a%b的值,然后在求gcd(a%b, b)

  1. #include<iostream>
  2. #define int long long
  3. using namespace std;
  4. int gcd(int a,int b)
  5. {
  6. return b?gcd(b,a%b):a;
  7. }
  8. int32_t main()
  9. {
  10. string a;cin>>a;
  11. int b;cin>>b;
  12. int res=0;
  13. for(auto t:a)
  14. {
  15. res=(res*10+(t-'0'))%b;
  16. }
  17. cout<<gcd(res,b);
  18. }

 E.小红走矩阵

思路:用Dijkstra来写,优先队列每次弹出所有路径最大值的最小值

  1. #include<iostream>
  2. #include<vector>
  3. #include<queue>
  4. #define x first
  5. #define y second
  6. using namespace std;
  7. typedef pair<int,int> PII;
  8. typedef pair<int,PII> PIII;
  9. const int N=505;
  10. int ne[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
  11. int a[N][N],n,dist[N][N];
  12. bool st[N][N];
  13. void Dijkstra()
  14. {
  15. priority_queue<PIII,vector<PIII>,greater<PIII>> heap;
  16. heap.push({a[1][1],{1,1}});
  17. dist[1][1]=a[1][1];
  18. while(heap.size())
  19. {
  20. auto it=heap.top();heap.pop();
  21. int xx=it.y.x,yy=it.y.y,ma=it.x;
  22. if(st[xx][yy]) continue;
  23. st[xx][yy]=true;
  24. for(int i=0;i<4;i++)
  25. {
  26. int tx=xx+ne[i][0],ty=yy+ne[i][1];
  27. if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&!st[tx][ty])
  28. {
  29. dist[tx][ty]=max(ma,a[tx][ty]);
  30. heap.push({dist[tx][ty],{tx,ty}});
  31. }
  32. }
  33. }
  34. }
  35. int main()
  36. {
  37. cin>>n;
  38. for(int i=1;i<=n;i++)
  39. for(int j=1;j<=n;j++) cin>>a[i][j];
  40. Dijkstra();
  41. cout<<dist[n][n];
  42. }

F.小红的数组 

 

思路: 线段树板题,跟“你能回答这些问题吗”做法一样,只是多了一个要存储每个区间的最小线段和,这里得用scanf输入才不会超时,关闭流用cin,cout还是会超时

  1. #include<iostream>
  2. #define int long long
  3. using namespace std;
  4. const int N=5e5+5;
  5. int w[N];
  6. struct node{
  7. int l,r;
  8. int sum,sum_min;
  9. int lmax,lmin;
  10. int rmax,rmin;
  11. int tmax,tmin;
  12. }tr[4*N];
  13. void pushup(node &u,node &l,node &r)
  14. {
  15. u.sum=l.sum+r.sum;
  16. u.lmax=max(l.lmax,l.sum+r.lmax);
  17. u.rmax=max(r.rmax,r.sum+l.rmax);
  18. u.tmax=max(max(l.tmax,r.tmax),l.rmax+r.lmax);
  19. u.sum_min=l.sum_min+r.sum_min;
  20. u.lmin=min(l.lmin,l.sum_min+r.lmin);
  21. u.rmin=min(r.rmin,r.sum_min+l.rmin);
  22. u.tmin=min(min(l.tmin,r.tmin),l.rmin+r.lmin);
  23. }
  24. void pushup(int u)
  25. {
  26. pushup(tr[u],tr[u<<1],tr[u<<1|1]);
  27. }
  28. void build(int u,int l,int r)
  29. {
  30. if(l==r) tr[u]={l,l,w[l],w[l],w[l],w[l],w[l],w[l],w[l],w[l]};
  31. else
  32. {
  33. tr[u]={l,r};
  34. int mid=(l+r)>>1;
  35. build(u<<1,l,mid),build(u<<1|1,mid+1,r);
  36. pushup(u);
  37. }
  38. }
  39. node query(int u,int l,int r)
  40. {
  41. if(tr[u].l>=l&&tr[u].r<=r) return tr[u];
  42. else
  43. {
  44. int mid=(tr[u].l+tr[u].r)>>1;
  45. if(mid>=r) return query(u<<1,l,r);
  46. else if(mid<l) return query(u<<1|1,l,r);
  47. else
  48. {
  49. node L=query(u<<1,l,r);
  50. node R=query(u<<1|1,l,r);
  51. node res;
  52. pushup(res,L,R);
  53. return res;
  54. }
  55. }
  56. }
  57. int32_t main()
  58. {
  59. int n;scanf("%lld",&n);
  60. for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
  61. build(1,1,n);
  62. int q;scanf("%lld",&q);
  63. while(q--)
  64. {
  65. int l,r;scanf("%lld %lld",&l,&r);
  66. node res=query(1,l,r);
  67. printf("%lld\n",max(abs(res.tmax),abs(res.tmin)));
  68. }
  69. }

 

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

闽ICP备14008679号