開開心心學演算法 一種排序

2021-06-08 06:07:37 字數 1734 閱讀 5457

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:3 描述

現在有很多長方形,每乙個長方形都有乙個編號,這個編號可以重複;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要求按照一下方式排序(預設排序規則都是從小到大);

1.按照編號從小到大排序

2.對於編號相等的長方形,按照長方形的長排序;

3.如果編號和長都相同,按照長方形的寬排序;

4.如果編號、長、寬都相同,就只保留乙個長方形用於排序,刪除多餘的長方形;最後排好序按照指定格式顯示所有的長方形;

輸入第一行有乙個整數 0

輸出順序輸出每組資料的所有符合條件的長方形的 編號 長 寬

樣例輸入

1

81 1 1

1 1 1

1 1 2

1 2 1

1 2 2

2 1 1

2 1 2

2 2 1

樣例輸出

1 1 1

1 2 1

1 2 2

2 1 1

2 2 1

這道題雖然題目長,但是很好理解,可是寫**的時候又覺得**不對了,總覺得自己寫的太複雜,可是又感覺必須要有這些過程。真可謂是一波三折啊。哈哈哈

廢話不多說了,下面是我的程式:

#include #include //用結構體儲存資料

typedef struct rectangle rect;

//排序,這裡用交換指標的位址來排序

void paixu( rect *p,rect *q)

int main()

else

} for(i=0;iflag = 1; //標誌初始化,預設為沒有需要丟棄的

for(i=0;isequence > rect[j]->sequence && rect[i]->flag && rect[j]->flag)

else if( !rect[i]->flag ) //如果前面乙個數是廢棄的數,直接進行下一輪比較

break;

else if( ! rect[j]->flag) //如果後乙個數是廢棄的數,則跳過去,繼續和下乙個比較

continue;

else if(rect[i]->sequence == rect[j]->sequence) //序號相等時比較長

else if(rect[i]->chang == rect[j]->chang) //長相等時比較寬

else if(rect[i]->wide == rect[j]->wide ) //寬相等時將其中乙個資料廢棄

rect[i]->flag = 0;

} }

}//end for(j=i+1;...)

for(i=0;iflag) )

continue;

printf("%d %d %d \n",rect[i]->sequence,rect[i]->chang,rect[i]->wide);

} for(i=0;i

執行時間12,記憶體308。

收穫:人腦思維和電腦的思維方式是很不一樣的,很多人腦覺得很容易的事件,電腦處理起來就很複雜(比如用眼睛去判斷乙個人是誰和用電腦去判斷),但也有很多人腦覺得很複雜的事情,電腦處理起來就覺得很輕鬆(比如大整數的運算)。所以我們需要合理的利用電腦的思維方式去解決我們生活中的難題。作為乙個程式設計師更是要深入了解和運用電腦思維,創造乙個乙個的奇蹟。

開開心心學演算法 一種排序

時間限制 3000ms 記憶體限制 65535kb 難度 3 描述 現在有很多長方形,每乙個長方形都有乙個編號,這個編號可以重複 還知道這個長方形的寬和長,編號 長 寬都是整數 現在要求按照一下方式排序 預設排序規則都是從小到大 1.按照編號從小到大排序 2.對於編號相等的長方形,按照長方形的長排序...

開開心心學演算法 排序演算法

歸併排序 快速排序 堆排序思路 對於乙個序列為1,a2,an 的序列而言,1 是有序序列,而2,an 為待排序序列 那麼先抽出a2,讓key a2,這一步的目的是防止當a1往後移動的時候a2被覆蓋掉 然後讓a1與a2比較,如果a1 a2,則保持a2的位置不變 否則將a1向後移動一位,那麼此時a1就在...

開開心心學演算法 噴水裝置(一)

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述現有一塊草坪,長為20公尺,寬為2公尺,要在橫中心線上放置半徑為ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數ri 0 輸入第一行m表示有m組測試資料 每一組測試資料的第一行有乙個整數數n,n表示共有n個噴水裝置,...