BestCoder Round #32 1001

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

官方题解:

对于输入的每一行一两个整数作差,按照差值从大到小排序,如果差值一样,按照后面的整数从小到大排序,如果还是一样按照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("\n");
    }
    return 0;
}

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

代码如下:

时间: 2024-08-09 19:27:17

BestCoder Round #32 1001的相关文章

BestCoder Round #2 1001 (简单处理)

题目链接 题意:给N条信息,每个信息代表有x个人从开始的时间 到 结束的时间在餐厅就餐, 问最少需要多少座位才能满足需要. 分析:由于时间只有24*60 所以把每个时间点放到 数组a中,并标记开始的时间+x, 结束的时间 -x.最后累加比较. 如果时间点太多的时候可以把时间点放到结构体里,排序,然后依次枚举结构体. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <

字符串处理 BestCoder Round #43 1001 pog loves szh I

题目传送门 1 /* 2 字符串处理:是一道水题,但是WA了3次,要注意是没有加'\0'的字符串不要用%s输出,否则在多组测试时输出多余的字符 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 using namespace std; 9 10 typedef long long ll; 11 const int MAXN = 1

暴力 BestCoder Round #41 1001 ZCC loves straight flush

题目传送门 1 /* 2 m数组记录出现的花色和数值,按照数值每5个搜索,看看有几个已满足,剩下 5 - cnt需要替换 3 ╰· 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <iostream> 8 #include <cstring> 9 #include <string> 10 using namespace std; 11 12 const int MAXN = 1

暴力 BestCoder Round #46 1001 YJC tricks time

题目传送门 1 /* 2 暴力:模拟枚举每一个时间的度数 3 详细解释:http://blog.csdn.net/enjoying_science/article/details/46759085 4 期末考结束第一题,看看题解找找感觉:) 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <vector> 10 #include <iostr

贪心 BestCoder Round #39 1001 Delete

题目传送门 1 /* 2 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少: 3 否则再在tot里减去多余的即为答案 4 用set容器也可以做,思路一样 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <cstring> 9 #include <string> 10 #include <algorithm> 11 using

BestCoder Round #1 1001 &amp;&amp; 1002 hdu 4857 4858

hdu 4857 逃生 第一题是拓扑排序,不是按照字典序最小输出,而是要使较小的数排在最前面..赛后弄了好久,才比较明白,我一直以为 反向建图,i从1到n,开始深搜dfs( i ),对i点的边,由小到大继续搜一下,同时标记搜过的数,搜过之后就不再搜,搜到底之后ans[cnt++] = u;这样顺序输出就是答案,后来经过超哥指点,才明白深搜贪心是错的.只有 反向建图,用优先队列把较大的数尽量排在前面,然后反序输出才是正解.. 1 #include<iostream> 2 #include<

BestCoder Round #2 1001 TIANKENG’s restaurant

不得不说,bastcoder是个hack游戏啊!!! 题意:求最少要多少张椅子才能让所有来的客人有地方坐!! 就是一个区间的处理吧!!!和HDU  1556 我待水似流年,流年待我似水神似!!!! 求的是重叠的区间最大,我们只要标记每个区间会有多少人就可以了!!! 然后在从0到1440分统计就OK了!! AC代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<map> #inc

BestCoder Round #29 1001 GTY&#39;s math problem

GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description GTY is a GodBull who will get an Au in NOI . To have more time to learn alg

BestCoder Round #32

PM2.5 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 613    Accepted Submission(s): 326 Problem Description Nowadays we use content of PM2.5 to discribe the quality of air. The lower content of