• hdu_1031_结构体排序


    题目很好理解,将列求和,取前k大的

    我的代码思路:对列求和,后取出前k大的id加入结果数组,对比后面和第k大相同的评分id也加入到结果数组,最后对结果数组排序

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int Max = 200009;
     6 struct Node{
     7     double score;
     8     int id;
     9     bool operator < (const Node o) const{
    10         return score>o.score;
    11     }
    12 }node[Max];
    13 int ans[Max];
    14 int main()
    15 {
    16     int n,m,k;
    17     while(~scanf("%d%d%d",&n,&m,&k))
    18     {
    19         double tm;
    20         for(int i = 0; i < m; i++){
    21             node[i].id = i;
    22             node[i].score = 0;
    23         }
    24         for(int i = 0; i < n; i++){
    25             for(int j = 0; j < m; j++){
    26                 scanf("%lf",&tm);
    27                 node[j].score+=tm;
    28             }
    29         }
    30         sort(node,node+m);
    31         int cnt = 0;
    32         for(int i = 0; i < k; i++){
    33             ans[cnt++] = node[i].id+1;
    34         }
    35         int top = k;
    36         while(node[top].score==node[top-1].score){
    37             ans[cnt++] = node[top].id;
    38             top++;
    39         }
    40         sort(ans,ans+cnt);
    41         for(int i = k-1; i > 0; i--){
    42             printf("%d ",ans[i]);
    43         }
    44         printf("%d
    ",ans[0]);
    45     }
    46     return 0;
    47 }

    (有一种wa的痛叫忘记数组初始化)

    下面是看了大神的代码,原来自己想复杂了,直接对结构体进行两次排序即可

    get一种新方法,记录代码如下:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int Max = 200007;
     6 struct Node{
     7     double score;
     8     int id;
     9 }node[Max];
    10 bool cmpByScore(Node a, Node b){
    11     return a.score>b.score;
    12 }
    13 bool cmpById(Node a, Node b){
    14     return a.id>b.id;
    15 }
    16 int main()
    17 {
    18     int n,m,k;
    19     while(~scanf("%d%d%d",&n,&m,&k))
    20     {
    21         double tm;
    22         for(int i = 0; i < m; i++){
    23             node[i].id = i+1;
    24             node[i].score = 0;
    25         }
    26         for(int i = 0; i < n; i++){
    27             for(int j = 0; j < m; j++){
    28                 scanf("%lf",&tm);
    29                 node[j].score+=tm;
    30             }
    31         }
    32         sort(node,node+m,cmpByScore);
    33         sort(node,node+k,cmpById);
    34         for(int i = 0; i < k-1; i++){
    35             printf("%d ",node[i].id);
    36         }
    37         printf("%d
    ",node[k-1].id);
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    ssh 的参数 -o + 检查是否是无密码访问
    Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号
    Linux 下jJKD,Tomcat部署
    [转]深入理解Java的接口和抽象类
    Java 培训笔记
    十三、MySQL性能优化
    十二、MySQL用户管理
    十一、MySQL触发器
    十、MySQL视图
    九、MySQL存储过程和函数
  • 原文地址:https://www.cnblogs.com/shanyr/p/7216343.html
Copyright © 2020-2023  润新知