7 5 實驗 解題參考

2021-07-14 10:26:31 字數 2815 閱讀 2290

problem-a(hdu1157)

排序水題,將輸入資料排序用一次sort,輸出中位數即直接輸入第n/2個位置上的數。

#include

#include

#include

using

namespace

std;

int a[10010];

int main()

return

0;}

problem-b(hdu1106)

這一題排序的部分很簡單,將原串預處理分開,並逐一轉換成數字,對這些數字sort一遍就可以輸出了。

但是原串的預處理分割有點麻煩,需要考慮完備5出現的情況。

這裡給出幾組測試樣例,這些都過了基本就考慮完全了:

555556 //開頭有5的

1555556 //中間有一堆5的

125 //5結尾的

55552345891 //不是5結尾的

1234 //沒有5的

12345531232 //不是5結尾的

每次遍歷原串的每個位置,根據是否是5、出現5時位置與周邊的情況決定分割。具體處理見標程。

#include

#include

#include

#include

#include

#include

using

namespace

std;

char s[10010];

int a[10010];

int change(string s)//將字串轉換成數字

int main()

else

if(s[i] == '5' && s[i - 1] != '5' && i != 0) //是5且不能一堆5且5不能為第乙個

}sort(a, a + num);

for(int i = 0; i < num - 1; ++i)

printf("%d ", a[i]);

printf("%d\n", a[num - 1]);

}return

0;}

problem-c(hdu1031)

這一題需要做兩趟排序,第一趟是對計算出的總滿意度降序,排過之後可以確定能取到的前k項,但輸出要求按編號降序,所有對前k個元素又要按條件再排序一次。

注意為排序方便,每個元素應該構造乙個結構體,記錄其總滿意度和其編號。第一次排序對所有元素,所以範圍是【a,a+m】,第二次是取前k個,所有範圍是【a,a+k】。兩次排序條件不一樣,必須要自己寫出兩個比較函式(cmp1、cmp2)。

#include

#include

using

namespace

std;

struct stu

;int cmp1(stu a,stu b)

int main()

}sort(s,s+m,cmp1);

sort(s,s+k,cmp2);

for(i=0;icout

<1;

if(i1)

cout

<<' ';

}cout

0;}

problem-d

這道題有必要說一下題目大意了,稍有不慎就繞暈了tat

題目大意:給你n個0~200之間的數,每個數對應有乙個函式值,若所有的函式值出現的頻率都相等而自變數不相等時是bad,否則輸出頻率最高的函式值,若有多個公升序輸出。

前期處理很好做,就是輸入乙個數,將其轉換為函式值存起來。

然後排序就好,但排完後是要看頻率最高而不是當前數字大小。

那麼可以對排好的順序陣列加個標籤,相同的數排在一起正好可以累計計數,即每組相同的數最後乙個的標記數出了其出現的總個數。

有了這個計數,找頻率最高也就是找計數最大,引進乙個變數m更新就好。

但可能有bad的情況,那麼再引進乙個變數sm數出關聯最大頻率(一會可能要輸出)的數的個數。如果最後它等於n,那麼小心了,這說明所有函式值出現頻率相等,肯是bad。

為什麼以上情況不能直接確定bad呢(這也是我wa到落淚的地方),注意題意,頻率都相同但數值有不相同才bad,否則照常輸出的。

所有可以通過剛剛的標記陣列,看最後乙個計數標記,若累計為n說明數字全一樣,照常輸出,多累計不為n才說明數值有不同的,所以符合(sm==n && num[n-1]!=n)的才是bad情況。

出去bad的情況,直接輸出就很好輸出了,從頭到尾找一遍,如果標記計數等於最大值m,就是要輸出的元素,為了調整換行格式,需要提前倒著找到最後乙個,這是常見的輸出小技巧。

具體見程式。

#include

#include

#include

using

namespace

std;

int a[1000000],num[1000000];

int main()

sort(a,a+n);

for(int i=0;i1;

for(int i=1;iif(a[i]==a[i-1]) num[i]=num[i-1]+1;

m=0;sm=0;

for(int i=0;iif(num[i]>m)

else

if(num[i]==m) sm+=num[i];

t++;printf("case #%d:\n",t);

if(sm==n && num[n-1]!=n) printf("bad mushroom\n");

else

}return

0;}

7 7 實驗 解題參考

problema hdu2037 這道解題,是希望看到節目盡可能多,那麼安排好前面的節目後,如果剩下的時間更多,能選擇的節目就更多。所以貪心策略是對每個節目的結束時間排序,目的是使剩餘時間留下,再判斷還能看幾個節目。對節目時間的排序結束後,依次判斷,這次要看的節目的開始時間是否大於上次看的節目的結束...

7 14 實驗 解題參考

problema hdu1215 problemb hdu1286 這兩題是上課例題,不再贅述了。problemc hdu1406 一 這題的資料可以直接判斷,在num1和num2之間的數是否符合要求。但有個巨坑需要注意,num1和num2不一定是大小順序給出的!二 但既然學會了篩選法,很明顯可以看...

LeetCode 75 解題與優化

given an array with n objects colored red,white or blue,sort them so that objects of the same color are adjacent,with the colors in the order red,whit...