9 条题解

  • 10
    @ 2022-12-26 8:45:39

    本蒟蒻还没有熟练掌握结构体所以 · · · · · · 就五个数组!

    上代码!!!(后面有极简代码)

    AC代码(数组)

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	cin >> n;
    	int x[n], y[n], z[n], all[n], num[n];
    	for (int i = 0; i < n; i++)
        {
    		cin >> x[i] >> y[i] >> z[i];
    		all[i] = x[i] + y[i] + z[i];
    		num[i] = i;
    	}
    	for (int i = 0; i < n - 1; i++)
        {
    		for (int j = 0; j < n - 1; j++)
            {
    			if (all[j] < all[j + 1])
                {
    				swap(all[j], all[j + 1]);
    				swap(x[j], x[j + 1]);
    				swap(num[j], num[j+1]);
    			}
    			else if (all[j] == all[j + 1] && x[j] < x[j + 1])
                {
    				swap(all[j], all[j + 1]);
    				swap(num[j], num[j + 1]);
                    swap(x[j], x[j + 1]);
    			}
    			else if (all[j] == all[j + 1] && x[j] == x[j + 1] && num[j] > num[j + 1])
                {
    				swap(all[j], all[j + 1]);
    				swap(num[j], num[j + 1]);
                    swap(x[j], x[j + 1]);
    			}
    		}
    	}
    	for (int i = 0; i < 5; i++)
        {
    		printf("%d %d\n", num[i] + 1, all[i]);
    	}
        return 0;
    }
    

    附极简AC代码

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n, x, y, z, p[310];
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> x >> y >> z;
            p[i] = (x + y + z) * 1000000 + x * 1000 + 999 - i;
        }
        sort(p + 1, p + n + 1);
        for (int i = n; i >= n - 4; --i)
            cout << 999 - p[i] % 1000 << " " << p[i] / 1000000 << endl;
        return 0;
    }
    

    点个赞吧!求求啦!

    • 2
      @ 2024-2-6 15:25:32

      #挑战全网行数最少(5行)

      #include <bits/stdc++.h>
      struct V {int id, a, b, c, d;}v[305];
      bool cmp(V x, V y){if (x.d != y.d){return x.d > y.d;}else if (x.a != y.a){return x.a > y.a;} else {return x.id < y.id;}}
      int n;
      int main(){scanf("%d", &n);for (int i = 1;i <= n;i++){scanf("%d%d%d", &v[i].a, &v[i].b, &v[i].c);v[i].id = i, v[i].d = v[i].a + v[i].b + v[i].c;}std::sort(v + 1, v + n + 1, cmp);for (int i = 1;i <= n && i <= 5;i++) printf("%d %d\n", v[i].id, v[i].d);}
      
      • 2
        @ 2022-10-3 21:33:36

        题解

        这道题不是很难,乍一看排序很复杂,其实是一个结构体数组排序。会的一听就明白了,不会的完全不懂。 我这里就来解释一下,dalao可以直接跳过。

        结构体,struct,就是指将一些变量和方法组合成一个整体,有些像一个类型,可以用它定义变量、数组,而且还可以访问数据和运行方法。有点像低配的class。class其实就是他的升级版,添加了公私(public, protected, private),还有继承、多态之类的类属性。好像有点跑题了。这里就简单介绍一下。

        结构体做成的数组也是可以排序的,但是我们直接用sort肯定不行,因为我们的结构体没有小于号重载(就是通过形如operator <为名的函数,调用时可以把本对象和参数对象进行比较)或者定义cmp函数。一般来说cmp函数较为简单。

        那么如何定义cmp函数呢?sort内核需要我们在需要交换元素(以冒泡排序理解一下,其实sort也有可能是别的 O(nlogn)O(nlogn) 排序)时返回 0,而不需要时返回 1,有些像我们自己写冒泡排序时的if (a[i] > a[j]),通过这样可以改变排序的方向。

        这里题目要求:先按总分从高到低排序,如果两个同学总分相同,…………

        先看到这里,总分可以在结构体里定义,除了记录三科成绩 a,b,ca, b, c,还要记录总分 sumsum

        struct student // 终于出现代码了
        {
            int a, b, c, sum; // 其中的变量
            // 还可能在这里有些函数
        }; // 注意struct, union, class这里有个分号
        bool cmp(student a, student b) // 注意格式
        {
            return a.sum > b.sum;
            // 这里比较巧妙,如果a总分大于b,确实不用交换a、b,反之亦然
        }
        

        接着看:…………再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,…………

        停停停,这里说需要语文成绩,结构体里有 aa,再看 cmpcmp 函数。

        struct student
        {
            int a, b, c, sum;
        }; // 注意分号
        bool cmp(student a, student b)
        {
            if (a.sum == b.sum) // 只有在相等时才进入if
            {
                return a.a > b.a;
                // 这个和下面有些类似,语文成绩a比b好,就不必交换,这里前提是a、b总分相同
            }
            return a.sum > b.sum;
        }
        

        最后是:…………那么规定学号小的同学排在前面。

        后面的不要了。我们还需要学号,我们可以在结构体里加一个 ididcmpcmp 里在 a.a=b.aa.a = b.a 时就根据学号排序。

        struct student
        {
            int id, a, b, c, sum;
        }; // 注意分号
        bool cmp(student a, student b)
        {
            if (a.sum == b.sum)
            {
                if (a.a == b.a) return a.id < b.id; // 这里用小于号,因为学号按小到大排序
                return a.a > b.a;
            }
            return a.sum > b.sum;
        }
        

        那这个就差不多了,接下来就是输入输出。

        #include <bits/stdc++.h>
        using namespace std;
        int n, a, b, c;
        struct student
        {
            int id, a, b, c, sum;
        } s[305]; // 可以在这里直接定义结构体变量
        bool cmp(student a, student b)
        {
            if (a.sum == b.sum)
            {
                if (a.a == b.a) return a.id < b.id;
                return a.a > b.a;
            }
            return a.sum > b.sum;
        }
        int main()
        {
            scanf("%d", &n);
            for (int i = 1; i <= n; i++)
            {
                scanf("%d%d%d", &a, &b, &c);
                s[i].id = i;
                s[i].a = a;
                s[i].b = b;
                s[i].c = c;
                s[i].sum = a + b + c; // 提前计算
            }
            sort(s + 1, s + n + 1, cmp); // 排序
            for (int i = 1; i <= 5; i++)
            {
                printf("%d %d\n", s[i].id, s[i].sum);
            }
            return 0;
        }
        

        这里再吐槽一句,他说了 n300n \le 300,也没说 5n5 \le n,所以说有可能 nn 小于 55,如果数组越界就 RE 了。所以这里我循环写的是:

        for (int i = 1; i <= min(5, n); i++)
        

        这样不会越界,但是输出题目里说:

        55 行,每行是两个用空格隔开的正整数,依次表示前 55 名学生的学号和总分。

        55 行???

        而且 i <= 5 对了!为此,我只能说:

        数据太弱了啊!!!

        不过在考场上,建议大家谨慎行事。不过题目不都是被审核的吗?哪里会出现这种情况?

        ACAC CodeCode

        #include <bits/stdc++.h>
        using namespace std;
        int n, a, b, c;
        struct student
        {
            int id, a, b, c, sum;
        } s[305];
        bool cmp(student a, student b)
        {
            if (a.sum == b.sum)
            {
                if (a.a == b.a) return a.id < b.id;
                return a.a > b.a;
            }
            return a.sum > b.sum;
        }
        int main()
        {
            scanf("%d", &n);
            for (int i = 1; i <= n; i++)
            {
                scanf("%d%d%d", &a, &b, &c);
                s[i].id = i;
                s[i].a = a;
                s[i].b = b;
                s[i].c = c;
                s[i].sum = a + b + c;
            }
            sort(s + 1, s + n + 1, cmp);
            for (int i = 1; i <= 5; i++)
            {
                printf("%d %d\n", s[i].id, s[i].sum);
            }
            return 0;
        }
        
        • 1
          @ 2022-8-23 14:40:50

          根据题目所说排序并输出即可

          struct h
          {
              int x,y,z,sum,m;
          }a[500];
          bool cmp(h x1,h x2)
          {
              if (x1.sum==x2.sum)
              {
                  if (x1.x==x2.x)
                  {
                      return x1.m<x2.m;
                  }
                  else
                  {
                      return x1.x>x2.x;
                  }
              }
              else
              {
                  return x1.sum>x2.sum;
              }
          }
          for (int i=1;i<=n;i++)
          {
              cin>>a[i].x>>a[i].y>>a[i].z;
              a[i].m=i;
              a[i].sum=a[i].x+a[i].y+a[i].z;
          }
          sort(a+1,a+n+1,cmp);
          for (int i=1;i<=5;i++)
          {
              cout<<a[i].m<<" "<<a[i].sum<<'\n';
          }
          
          • 0
            @ 2024-2-14 22:40:41

            结构体&&排序

            学过结构体排序的跳过

            结构体:

            将一个变量或多个变量存在一个数据结构中(变量可以不同类型)

            定义结构体:struct{};

            排序:

            将一个数列按升序(降序)排序

            常见函数:sort(起始地址,终止地址);

            </cpp>
            #include <bits/stdc++.h>
            using namespace std;
            int n;
            struct Sum{
                int c,m,e,sum=0,pos;
            }ans[310];
            bool cmp(Sum x,Sum y){
                if (x.sum==y.sum){
                    if (x.c==y.c)return x.pos<y.pos;
                    else return x.c>y.c;
                }
                return x.sum>y.sum;
            }
            int main(){
                cin>>n;
                for (int i=1;i<=n;i++){
                    cin>>ans[i].c>>ans[i].m>>ans[i].e;
                    ans[i].sum+=ans[i].c+ans[i].m+ans[i].e;
                    ans[i].pos=i;
                }
                sort(ans+1,ans+1+n,cmp);
                for (int i=1;i<=5;i++)cout<<ans[i].pos<<" "<<ans[i].sum<<endl;
                return 0;
            }
            
            • 0
              @ 2022-10-23 16:30:17

              这题目很简单,不过要说一个知识点:结构体(struct)。

              结构体是什么???他其实是像int,long long,string,bool,double等等这样的数据类型中最特殊的一个,应为我可以自己定义一个数据类型,比如:

              struct node
              {
                  
              }x;
              

              这个代表我定义了个node类型的变量x。

              知道了结构体是什么后,这道题就很简单了。

              AC答案:

              #include <bits/stdc++.h>
              using namespace std;
              struct node
              {
              	int id; //id是学号
              	int x;  //x是语文
              	int y;  //y是数学
              	int z;  //z是英语
              }a[1001];  //定义了一个node类型的数组
              int n;  //有多少学生
              bool cmp(node q,node w)  //排序时要用到
              {
              	int r=q.x+q.y+q.z;  //先加总分,后面判断就不用那么麻烦了
              	int s=w.x+w.y+w.z;
              	if(r!=s)return r>s; //如果总分不相等就返回大的那个
              	else if(q.x!=w.x)return q.x>w.x; //如果语文分不相等就返回语文分大的那个
              	else return q.id<w.id;  //这个不用我说了 
              }
              int main()
              {
              	cin>>n;
              	for(int i=1;i<=n;i++)
              	{
              		a[i].id=i;    //将此时的编号(i)给a[i].id,因为后面排序要用
              		cin>>a[i].x;  //输入语文分数 
              		cin>>a[i].y;  //输入数学分数 
              		cin>>a[i].z;  //输入英语分数 
              	}
              	sort(a+1,a+1+n,cmp);  //用sort简单明了
              	if(n<=5)  //分类讨论输出 
              	{
              		for(int i=1;i<=n;i++)
              		{
              			cout<<a[i].id<<' '<<a[i].x+a[i].y+a[i].z<<endl;
              		}
              	}
              	else
              	{
              		for(int i=1;i<=5;i++)
              		{
              			cout<<a[i].id<<' '<<a[i].x+a[i].y+a[i].z<<endl;
              		}
              	}
                  return 0;
              }
              
              • 0
                @ 2022-10-6 20:00:26
                #include<bits/stdc++.h>
                using namespace std;
                struct f{
                	int xh;
                	int yw;
                	int sx;
                	int yy;
                	int zf;
                };//定义一个结构体,分别存储所有成绩。
                bool cmp(f a,f b)
                {
                	if(a.zf==b.zf)
                	{
                		if(a.yw==b.yw)
                		{
                			return a.xh>b.xh;
                		}
                		return a.yw<b.yw;
                	}
                	return a.zf<b.zf;
                }//这一段函数是重点,进行判断,再交换两者,进行结构体的排序。
                f a[100000];//数据范围要注意一下
                int main(){
                	int n;
                	cin>>n;
                	for(int i=1;i<=n;i++)
                	{
                		a[i].xh=i;
                		cin>>a[i].yw>>a[i].sx>>a[i].yy; 
                		a[i].zf=a[i].yw+a[i].sx+a[i].yy;
                	} 
                	sort(a+1,a+n+1,cmp);//使用快排,简单明了
                	for(int i=n;i>n-5;i--)
                	{
                		cout<<a[i].xh<<' '<<a[i].zf<<endl;
                	}//输出
                	return 0;//养成好习惯
                }
                //其实,这段代码还可以进行优化,可以在结构体内不定义数学成绩和英语成绩,直接算入总分,会使时间复杂度稍微少一些,就留给你们进行探索啦,上面的代码可以A哦。
                
                • 0
                  @ 2022-7-1 15:21:30

                  简单的结构体排序,按照题目意思进行模拟即可。

                  #include <cstdio> //printf
                  #include <algorithm> //sort 
                  #define maxn 305
                  using namespace std;
                  
                  int n;
                  
                  inline int read(){ //快读 
                      int x = 0 , f = 1;
                      char ch = getchar();
                      while(ch < '0' || ch > '9'){
                          if(ch == '-')
                              f = -1;
                          ch = getchar();
                      }
                      while(ch >= '0' && ch <= '9'){
                          x = (x << 1) + (x << 3) + (ch ^ 48);
                          ch = getchar();
                      }
                      return x * f;
                  }
                  
                  struct QWQ{ //学生 
                      int a , b , c , id , zf;
                      //语文,数学,英语,输入顺序,三课总分 
                      void qwq_read(int i){
                      	a = read();
                      	b = read();
                      	c = read();
                          id = i;
                          zf = a + b + c;
                  	}
                  }qwq[maxn];
                  
                  bool cmp(QWQ a , QWQ  b){
                  	//比较 
                      if(a.zf == b.zf){
                      	if(a.a == b.a)
                  			return a.id < b.id;
                      	else
                  			return a.a > b.a;
                      } 
                      return a.zf > b.zf;
                  }
                  
                  int main(){
                      n = read();
                      for(int i = 1;i <= n;i++)
                      	qwq[i].qwq_read(i);
                      sort(qwq + 1 , qwq + n + 1 , cmp);
                      //排序 
                      for(int i = 1;i <= 5;i++)
                      	printf("%d %d\n" , qwq[i].id , qwq[i].zf);
                  }
                  
                • -1
                  @ 2022-4-24 16:14:03

                  鼓励大家写题解,但注意题解格式。

                  给代码两端加上这个会舒服一些

                  ```cpp

                  你的代码

                  ```

                  </span>

                  这个点在键盘的左上角tab上面那个键,注意切换输入法

                  #include<iostream>
                  using namespace std;
                  int main()
                  {
                      int n;
                      cin>>n;//这是一个注释
                      return 0;
                  } 
                  

                  请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

                  抄袭题解一经发现直接取消成绩。

                • 1

                [普及][NOIP2007 普及组] 奖学金

                信息

                ID
                1137
                时间
                1000ms
                内存
                128MiB
                难度
                4
                标签
                递交数
                704
                已通过
                325
                上传者