51Nod 1954 交叉排序 c c 題解

2021-09-27 11:47:04 字數 2613 閱讀 4439

題目描述

給出乙個序列,這個序列中每乙個元素要麼是乙個英文單詞,要麼是乙個整數。除了最後乙個元素,每乙個元素後面有乙個逗號,再根乙個空格。最後乙個元素後面有乙個句號。

現在要對這個序列進行排序,把所有的單詞按照字典序公升序排序,所有的整數按照公升序排序。並且保持原來是整數的位置還是整數,原來是單詞的位置還是單詞。單詞比較的時候忽略大小寫。

輸入單組測試資料。

輸入若干個元素,對於單詞,非空且長度不超過10,只由大小寫字母組成;對於整數,絕對值<=1000000。元素個數不超過10000,序列中至少有乙個元素。

輸出輸出排序之後的序列。按照輸入的格式。

輸入樣例

樣例輸入1

banana, strawberry, orange.

樣例輸入2

banana, strawberry, orange.

輸出樣例

樣例輸出1

banana, orange, strawberry.

樣例輸出2

banana, orange, strawberry.

題解:

這是一道模擬題,我覺得不算難,但是也不算簡單,我的思路

首先輸入每個元素作為乙個結構體vec,結構體儲存四個資訊:編號、識別符號(單詞or整數)、string單詞,int整數。

這裡有三個要注意的點:1. 元素為數字時可能是負數,開頭為-。2. 整數的位數可能不止一位。3. 要儲存下每個元素的序號,也就是要記錄下編號到結構體中,原因下面會說。

然後另外開兩個結構體,乙個是單詞結構體word,乙個是整數結構體data,遍歷一次全部元素的結構體即可,這樣做的原因就是方便分別排序,因為單詞和整數不能排序。

這裡也有乙個要注意的點:對單詞進行排序的時候,是忽略大小寫的,所以我在cmp_s()裡面把單詞轉成了小數(但是因為傳進去的是值,所以根本不用擔心把結構體的大小寫改變了。)

做完了上述兩步後,開乙個結果結構體res,用來儲存最後的結果,從0遍歷到n-1,

如果是在vec結構體中是單詞,則按單詞的順序word_cnt(從小到大)進入res

如果在vec結構體中是整數,則按整數的順序data_cnt(從小到大)進入res

注意:我覺得這一步很關鍵,因為題目要求原來是單詞的位置還是單詞,原來是整數的位置還是整數。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const ll inf = 0x3f3f3f3f3f3f3f3f;

const double pi = acos(-1.0);

const double e = exp(1.0);

const int mod = 1e9+7;

const int max = 1e5+5;

struct elem

;vector vec;// 存放起始元素

vector word;// 存放vec中的單詞

vector data;// 存放vec中的整數

vector res;// 存放排序後的結果

int cmp_s(elem a,elem b)

for(int i = 0; i < b.word.length(); i++)

return a.word < b.word;

}int cmp_d(elem a,elem b)

int main()

else

tmp.num = cnt; cnt++;

vec.push_back(tmp);

if(str[(int)str.length()-1] == '.')

}for(int i = 0; i < vec.size(); i++)

else

}sort(word.begin(),word.end(),cmp_s);

sort(data.begin(),data.end(),cmp_d);

int word_cnt = 0;

int data_cnt = 0;

for(int i = 0; i < vec.size(); i++)

else

}for(int i = 0; i < res.size(); i++)

else

if(i != cnt-1)

else

}return 0;

}

51Nod 1241 特殊的排序

題目傳送門 分析 之前想的是求lis,後面發現這組資料會出問題 3 1 2 4 5 6。其實這裡的lis還應當滿足前後兩個元素的值相差為1。比如上面的最長子串行為 3 4 5 6,而不是1 2 4 5 6。即只需移動1 2即可。即如果n個數最長連續上公升子串行 這裡的連續指數值上連續,即前後相差1 ...

51nod 1241 特殊的排序

1241 特殊的排序 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 乙個陣列的元素為1至n的整數,現在要對這個陣列進行排序,在排序時只能將元素放在陣列的頭部或尾部,問至少需要移動多少個數字,才能完成整個排序過程?例如 2 5 3 4 1 將1移到頭部 1 2 5...

51Nod 1241 特殊的排序

乙個陣列的元素為1至n的整數,現在要對這個陣列進行排序,在排序時只能將元素放在陣列的頭部或尾部,問至少需要移動多少個數字,才能完成整個排序過程?例如 2 5 3 4 1 將1移到頭部 1 2 5 3 4 將5移到尾部 1 2 3 4 5 這樣就排好了,移動了2個元素。給出乙個1 n的排列,輸出完成排...