当前位置:   article > 正文

2023年(GPLT)上海理工大学校内选拔赛(同步赛) 部分题目 题解_gplt官方考点

gplt官方考点

本人大一,说来惭愧,这比赛只做出来了两道题;(特此来写几篇题解)

 

第一道讲解的题目是 C题 也就是N皇后的;

当时没做出来 赛后看了很多人的题解也都是大同小异:但是我从来都没有见过(特此拿来整理一下)

思路:本题的关键就是如何不通过暴力模拟的方法(也就是直接开一个map的二维数组)实现记录每个皇后棋子的攻击范围,皇后的攻击路径有两种,一种是横冲直撞的(每一行 每一列都会受到攻击)(这种我们直接可以使用两个一维数组记录下攻击的行和列) 第二种是歪来斜去的(当时就是卡在这里,不理解这个到底怎么实现)。但是实际上就是,在两个方向的某一个方向上 的X和Y相加为一个定值并且每个不相交的同向的斜线的网格点上的定值互不相同,在另一个方向上,X和Y的差值的绝对值也是唯一特征的!!!

所以代码就很简单啦:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[1001000],b[1001000],c[2001000],d[2001000];
  4. //别人的代码 不得不说真的是太厉害了
  5. //关键点在于使用不同的方式唯一表示出 每两个方向上的斜线的表示!!
  6. //也就是如何特征化的表示数据
  7. int main()
  8. {
  9. int n,t;
  10. cin >> n>> t;
  11. int x,y;
  12. for(int i=1; i<=t; i++)
  13. {
  14. scanf("%d %d",&x,&y);
  15. if(a[x]==0&&b[y]==0&&c[x-y+n]==0&&d[x+y]==0)
  16. {
  17. a[x]++;
  18. b[y]++;
  19. c[x-y+n]++;
  20. d[x+y]++;
  21. printf("Yes\n");
  22. }
  23. else
  24. {
  25. printf("No\n");
  26. }
  27. }
  28. return 0;
  29. }

第二题是

这道题很明显是个签到题,说真的做不出来就真的很尬。

首先是当时没理解清楚题意,我一直不清楚案例当中是怎么做出9来的?

后来(比赛过后) 才看懂(笨):1 1 2 2 3的首先每个i 与 j可以是相等的 也就是说 先就有5个对子,然后是 <1,2> <2,1>  <3,4> <4,3>这四个就这样emm

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. long long a[200000];
  4. int main ()
  5. {
  6. int n,maxt=0;
  7. cin>>n;
  8. for(int i=0;i<n;i++)
  9. {
  10. int temp;
  11. cin>>temp;
  12. a[temp]++;
  13. }
  14. long long ans=0;
  15. for(int i=0;i<=200000;i++)
  16. {
  17. ans+=a[i]*(a[i]-1);
  18. }
  19. ans+=n;
  20. cout<<ans<<endl;
  21. return 0;
  22. }

第三道题是D题 

 

DA:(

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<set>
  5. using namespace std;
  6. typedef long long ll;
  7. ll n1,n2,n3,n4;
  8. int main(){
  9. multiset<int> s;
  10. ll n;
  11. cin>>n;
  12. ll x,y,c;
  13. ll xx,yy,cc;
  14. cin>>x>>y>>c;
  15. cin>>xx>>yy>>cc;
  16. for(int i=1;i<=n;i++){
  17. ll a,b;
  18. cin>>a>>b;
  19. if(a*x+c>=-1ll*b*y){
  20. if(a*xx+cc>=-1l*b*yy){
  21. n1++;
  22. }else{
  23. n2++;
  24. }
  25. }else{
  26. if(a*x+c<-1l*b*y){
  27. if(a*xx+cc>=-1l*b*yy){
  28. n3++;
  29. }else{
  30. n4++;
  31. }
  32. }
  33. }
  34. }
  35. s.insert(n1);
  36. s.insert(n2);
  37. s.insert(n3);
  38. s.insert(n4);
  39. for(multiset<int>::iterator i=s.begin();i!=s.end();i++){
  40. cout<<*i<<" ";
  41. }
  42. return 0;
  43. }

这个我当时是卡在了 if的判断中 

现在可以思考一下if(a*x+c<-1l*b*y) 和 if(a*xx+cc+bb*y<0) 这两个有什么区别?

其实就会发现a b x y 这些乘积加起来非常大 很有可能会爆long long所以必须要避免的话,可以使用这样的方式!(就是写在两边)

其实还有像F E题之类的,也是值得细讲的。现在太晚了,还是先睡吧!

00点35分 2023年3月13日

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