zoukankan      html  css  js  c++  java
  • 奥运排序问题

    hdoj 3789

    题目大意:

    解决:用sort函数中不同的cmp

    15MS 1212K
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N=1000000;
    struct node
    {
    int id;  
    int gold;
    int  total;
    double goldper;
    double totalper;
    };
    node nation[N];
    int num[N];
    bool mark[N];
    int rank[N];
    int kind[N];
    bool cmp1(const node &a,const node &b)
    {
        return a.gold>b.gold;
    }
    bool cmp2(const node &a,const node &b)
    {
        return a.total>b.total;
    }
    bool cmp3(const node &a,const node &b)
    {
        return a.goldper>b.goldper;
    }
    bool cmp4(const node &a,const node &b)
    {
        return a.totalper>b.totalper;
    }
    
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int i,j;
            int people;
            memset(mark,0,sizeof(mark));
            for(i=0;i<n;i++)
            {
                scanf("%d%d%d",&nation[i].gold,&nation[i].total,&people);
                nation[i].id=i;
                nation[i].goldper=(double)nation[i].gold/(double)people;
                nation[i].totalper=(double)nation[i].total/(double)people; 
            }
            
            for(i=0;i<m;i++){scanf("%d",&num[i]);mark[num[i]]=1;}
            for(i=0,j=0;i<n;i++)
               if(mark[i])nation[j++]=nation[i];
               
            sort(nation,nation+m,cmp1);
            int tmp=0,t=nation[0].gold;
            for(i=0;i<m;i++)
            {
                kind[nation[i].id]=1;
                if(nation[i].gold!=t ){tmp=i;t=nation[i].gold;}
                rank[nation[i].id]=tmp;
            }
            
            sort(nation,nation+m,cmp2);
             tmp=0;t=nation[0].total;
            for(i=0;i<m;i++)
            {
                   if(nation[i].total!=t){tmp=i;t=nation[i].total;}
                   if(rank[nation[i].id] > tmp)
                   {  
                       rank[nation[i].id]= tmp ; 
                       kind[nation[i].id]=2; 
                   }
            }   
            
            sort(nation,nation+m,cmp3);
            tmp=0; double tt=nation[0].goldper;
            for(i=0;i<m;i++)
            {
                   if(nation[i].goldper!=tt){tmp=i;tt=nation[i].goldper;}
                    if(rank[nation[i].id] > tmp)
                   {  
                       rank[nation[i].id]= tmp ; 
                       kind[nation[i].id]=3; 
                   }
           }
           
            sort(nation,nation+m,cmp4);
             tmp=0;tt=nation[0].totalper;
            for(i=0;i<m;i++)
            {
                   if(nation[i].totalper!=tt){tmp=i;tt=nation[i].totalper;}
                   if(rank[nation[i].id] > tmp)
                   {  
                       rank[nation[i].id]= tmp ; 
                       kind[nation[i].id]=4; 
                   }
            }
          for(i=0;i<m;i++)
           printf("%d:%d\n",rank[num[i]]+1,kind[num[i]]);
           printf("\n");
           
        }
      //  system("pause");
        return 0;
    }
    

      

    31MS	5120K
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N=1000000;
    struct node
    {
    int id;  
    int gold;
    int  total;
    double goldper;
    double totalper;
    };
    node nation[N];
    int num[N];
    bool mark[N];
    int rank[N];
    int kind[N];
    bool cmp1(const node &a,const node &b)
    {
        return a.gold>b.gold;
    }
    bool cmp2(const node &a,const node &b)
    {
        return a.total>b.total;
    }
    bool cmp3(const node &a,const node &b)
    {
        return a.goldper>b.goldper;
    }
    bool cmp4(const node &a,const node &b)
    {
        return a.totalper>b.totalper;
    }
    
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int i,j;
            int people;
            memset(mark,0,sizeof(mark));
            memset(rank,0,sizeof(rank));
            for(i=0;i<n;i++)
            {
                scanf("%d%d%d",&nation[i].gold,&nation[i].total,&people);
                nation[i].id=i;
                nation[i].goldper=(double)nation[i].gold/(double)people;
                nation[i].totalper=(double)nation[i].total/(double)people; 
            }
            
            for(i=0;i<m;i++){scanf("%d",&num[i]);mark[num[i]]=1;}
            for(i=0,j=0;i<n;i++)
               if(mark[i])nation[j++]=nation[i];
               
            sort(nation,nation+m,cmp1);
            rank[nation[0].id]=0;
            kind[nation[0].id]=1;
            int tmp=0;
            for(i=1;i<m;i++)
            {
                kind[nation[i].id]=1;
                if(nation[i].gold!=nation[i-1].gold)tmp=i;
                rank[nation[i].id]=tmp;
            }
            
            sort(nation,nation+m,cmp2);
            if(rank[nation[0].id]>0)
            {
                rank[nation[0].id]=0;
                kind[nation[0].id]=2;
            }
            tmp=0;
            for(i=1;i<m;i++)
            {
                   if(nation[i].total!=nation[i-1].total)tmp=i;
                   if(rank[nation[i].id] > tmp)
                   {  
                       rank[nation[i].id]= tmp ; 
                       kind[nation[i].id]=2; 
                   }
            }   
            
            sort(nation,nation+m,cmp3);
            if(rank[nation[0].id]>0)
            {
                rank[nation[0].id]=0;
                kind[nation[0].id]=3;
            }
            tmp=0;
            for(i=1;i<m;i++)
            {
               if(nation[i].goldper!=nation[i-1].goldper)tmp=i;
                    if(rank[nation[i].id] > tmp)
                   {  
                       rank[nation[i].id]= tmp ; 
                       kind[nation[i].id]=3; 
                   }
           }
           
            sort(nation,nation+m,cmp4);
            if(rank[nation[0].id]>0)
            {
                rank[nation[0].id]=0;
                kind[nation[0].id]=4;
            }
            tmp=0;
            for(i=1;i<m;i++)
            {
                   if(nation[i].totalper!=nation[i-1].totalper)tmp=i;
                   if(rank[nation[i].id] > tmp)
                   {  
                       rank[nation[i].id]= tmp ; 
                       kind[nation[i].id]=4; 
                   }
            }
          for(i=0;i<m;i++)
           printf("%d:%d\n",rank[num[i]]+1,kind[num[i]]);
           printf("\n");
           
        }
      //  system("pause");
        return 0;
    }
    

      通过这两个时空比较,我发现原来分散着写与用一个循环相比运行时间和运行的空间都不如用循环,差别很明显啊

  • 相关阅读:
    机器学习-初学者入门
    安装.cer证书并将证书从.cer格式转化为.pem格式
    字符串反转C#的实现
    Linux系统下远程文件拷贝scp命令
    【Django】ESRTful APi
    数据结构-栈跟队列基础部分
    数据结构-排序
    数据分析--Matplotlib的基本使用
    数据分析--pandas的基本使用
    数据分析--numpy的基本使用
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2141725.html
Copyright © 2011-2022 走看看