zoukankan      html  css  js  c++  java
  • BestCoder Round #32_1001 以及 hdu 5182

    http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=570&pid=1001

     http://acm.hdu.edu.cn/showproblem.php?pid=5182

    这道题也是hdu上的5182

    官方题解:

    对于输入的每一行一两个整数作差,按照差值从大到小排序,如果差值一样,按照后面的整数从小到大排序,如果还是一样按照ID从小到大排序。

    首先注意下数据范围,大约100组数据,所有整数都在[1,100] 的范围内,即使是用冒泡法或者选择法排序也不会TLE。其次就要考虑如何将城市的标号一并排序,可以构建一个专门保存城市标号的数组,排序的时候按城市标号对应的数据进行比较,只改变城市标号的位置,数据不用排序。、

    先贴一个最简单的代码。

    #include<stdio.h>
    
    int main()
    {
        int i,j,n,pm[110][2],c[110],t,s[110];
    
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;i++)
            {
                scanf("%d%d",&pm[i][0],&pm[i][1]);
                c[i]=pm[i][0]-pm[i][1];
                s[i]=i;                            //s数组记录城市的标号
            }
            for(i=0;i<n-1;i++)                     //首先按照差值排序,注意只是将城市的标号排序
            {
                for(j=0;j<n-1-i;j++)
                {
                    if(c[s[j]]<c[s[j+1]])
                    {
                        t=s[j];
                        s[j]=s[j+1];
                        s[j+1]=t;
                    }
                }
            }
            for(i=0;i<n-1;i++)                      //按照第二次的测量值升序排序,同样将城市的标号排序
            {
                if(c[s[i]]==c[s[i+1]])
                {
                    if(pm[s[i]][1]>pm[s[i+1]][1])
                    {
                        t=s[i];
                        s[i]=s[i+1];
                        s[i+1]=t;
                        if(i>0)
                            i=i-2;
                    }
                }
            }
            for(i=0;i<n-1;i++)                       //按照输入的顺序排序
            {
                if(c[s[i]]==c[s[i+1]])
                {
                    if(pm[s[i]][1]==pm[s[i+1]][1])
                    {
                        if(s[i]>s[i+1])
                        {
                            t=s[i];
                            s[i]=s[i+1];
                            s[i+1]=t;
                            if(i>0)
                                i=i-2;
                        }
                    }
                }
            }
            for(i=0;i<n;i++)
            {
                if(i==0)
                    printf("%d",s[i]);
                else
                    printf(" %d",s[i]);
            }
            printf("
    ");
        }
        return 0;
    }

    赛后觉得时间用的太多,发现可以用一个结构体将数据保存,用sort函数排序,只要写一下cmp函数。

    代码如下:

    #include<stdio.h>
    #include<algorithm>
    
    using namespace std;
    
    struct node
    {
        int pm1;
        int pm2;
        int decrease;
        int number;
    }city[110];
    
    bool cmp(struct node x,struct node y)
    {
        if(x.decrease!=y.decrease)
            return x.decrease>y.decrease;
        if(x.pm2!=y.pm2)
            return x.pm2<y.pm2;
        return x.number<y.number;
    }
    
    int main()
    {
        int n;
    
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=0;i<n;i++)
            {
                scanf("%d%d",&city[i].pm1,&city[i].pm2);
                city[i].decrease=city[i].pm1-city[i].pm2;
                city[i].number=i;
            }
            sort(city,city+n,cmp);
            for(int i=0;i<n;i++)
            {
                if(i==0)
                    printf("%d",city[i].number);
                else
                    printf(" %d",city[i].number);
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    徒手用Java来写个Web服务器和框架吧<第二章:Request和Response>
    徒手用Java来写个Web服务器和框架吧<第一章:NIO篇>
    Linux使用小笔记<进程操作篇>
    shell条件判断
    rz和sz上传下载文件
    vim 快捷键
    while read读取文本内容
    云主机启动提示Booting from Hard Disk GRUB
    centos7进入单用户模式
    账号被锁无法ssh登陆
  • 原文地址:https://www.cnblogs.com/yaoyueduzhen/p/BestCoder32_1001.html
Copyright © 2011-2022 走看看