2010暑期兴趣班之排序专题解题报告

ABCGHI解题报告-by helihui

A题:简单题。直接在一串里面处理稍微麻烦点。最简单直观的方法可以。把Z,O,J,7提取出来分在一个字符数组,对此字符串排序。另外按照原顺序放在另外一个字符数组。然后依次输出就行。

B题当然也是简单题目,也是根据描述,求出每行的measure 的值,然后排序。输出即可。

C题:归并可以。我用的是树状数组+离散化解决的。首先将问题转化,最小交换次数的等于各个数前比当前数大的个数的总和。
例如:
5
9
1
0
5
4
这组样例。  9前没有比它大数,1前有两个比它大,0前面有2个,5前面有1个,4前有2个。
所以一共 1+2+1+2 = 6
就是这样算出来的。n < 500,000 这个规模直接模拟时间复杂是O(n^2) 可想而知肯定超时。
这个题目转化后,非常常规的树状数组的应用,树状数组时间复杂度是n*logn
最坏情况运算9500000次  还是可以接受的。
树状数组操作是向下更新向上统计
注意下要统计的交换次数可能很大 需要用__int64

D,E,F,未做

G题还是比较简单,分开排序就可以。但是要记录下原来序列的位置是数字还是word。把排序好的根据位置的类型将数据放入该位置。然后输出这列序列就行。

H:题目最长递减非连续子序列应用。但是运用前需要处理下原序列。
开进来的车子可以放头,也可以放尾。那么我们所有可能的组合在一起运用最长递减非连续子序列就行了。
例:
3
1
2
3

1 2 3进来,我们处理成:3 2 1 2 3  然后运用最长递减非连续子序求出即可。说明下这里开始处理非排序,而是把原数列倒置再连到原数列前面组成一列。

I题:分割后,先判断长度,等的话strcmp比较排序。 可以把这些写在QSORT的仿函数cmp里。
int cmp(const void *a,const void *b)
{
      int t = strlen((char *)a)-strlen((char *)b);
      if(t==0)//如果长度相同
      {
              return strcmp((char *a),(char *)b);
       }
       return t;//如果不相等就按照长度排序
}


为解题报告打分
暂时不评分

★★
★★★
★★★★
★★★★★
发表您的评论(若贴AC代码或发表禁止言论等违禁行为将被删除并扣除积分)

|返回 |   | 转到页头|
Copyright @ 2008-2024(浙ICP备2022001332号), TZOJ. All Rights Reserved.