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;//如果不相等就按照长度排序
}