南工ACM 獨木舟上的旅行

2021-07-29 13:17:13 字數 1283 閱讀 4401

描述

進行一次獨木舟的旅行活動,獨木舟可以在港口租到,並且之間沒有區別。一條獨木舟最多只能乘坐兩個人,且乘客的總重量不能超過獨木舟的最大承載量。我們要儘量減少這次活動中的花銷,所以要找出可以安置所有旅客的最少的獨木舟條數。現在請寫乙個程式,讀入獨木舟的最大承載量、旅客數目和每位旅客的重量。根據給出的規則,計算要安置所有旅客必須的最少的獨木舟條數,並輸出結果。

輸入 第一行輸入s,表示測試資料的組數;

每組資料的第一行包括兩個整數w,n,80<=w<=200,1<=n<=300,w為一條獨木舟的最大承載量,n為人數;

接下來的一組資料為每個人的重量(不能大於船的承載量);

輸出 每組人數所需要的最少獨木舟的條數。

樣例輸入

3

85 6

5 84 85 80 84 83

90 3

90 45 60

100 5

50 50 90 40 60

樣例輸出

5

33

思路:貪心演算法

對於求 最多/最少 問題,可以考慮 貪心演算法 或者 動態規劃。

定義a[i] (i=1~n) 表示n個人的體重,對a[i]從小到大進行快排。

總共n個人,那麼最多需要n條船。如果每次運輸2個人,所需船數是最少的,所以大體思路就是一條船盡可能運輸2個人。

如何做到?a[i]已排好序。 就是看,最重的人和最輕的人,兩人能不能一起乘船,如果可以就讓他們一起乘船,然後j++,k–(因為此時不讓a[1]與a[n]一起,卻讓a[2]與a[n]一起,如果a[2]與a[n]可以一起,那麼a[2]與a[n-1]就一定可以一起,那為什麼不把a[2]留給a[n-1]呢?如果a[2]與a[n]不能夠一起,那不就浪費資源了?)

如果最重的人和最輕的人,兩人不能一起乘船,就讓最重的人乙個人乘船,因為他以後絕對找不到「伴侶」了,然後k–.

#include

#include

void kuaipai(int* a,int l,int r);

int main()

kuaipai(a,1,n);

j=1;

k=n;

num=0;

while(jif(a[j]+a[k]<=w)

else

}if(j==k)

printf("%d\n",num);

}return0;}

void kuaipai(int* a,int l,int r)

ACM 獨木舟上的旅行

時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述進行一次獨木舟的旅行活動,獨木舟可以在港口租到,並且之間沒有區別。一條獨木舟最多只能乘坐兩個人,且乘客的總重量不能超過獨木舟的最大承載量。我們要儘量減少這次活動中的花銷,所以要找出可以安置所有旅客的最少的獨木舟條數。現在請寫乙個程...

獨木舟上的旅行

獨木舟上的旅行 時間限制 3000 ms 記憶體限制 65535kb 難度 2 描述 進行一次獨木舟的旅行活動,獨木舟可以在港口租到,並且之間沒有區別。一條獨木舟最多只能乘坐兩個人,且乘客的總重量不能超過獨木舟的最大承載量。我們要儘量減少這次活動中的花銷,所以要找出可以安置所有旅客的最少的獨木舟條數...

獨木舟上的旅行

難度 2 描述進行一次獨木舟的旅行活動,獨木舟可以在港口租到,並且之間沒有區別。一條獨木舟最多只能乘坐兩個人,且乘客的總重量不能超過獨木舟的最大承載量。我們要儘量減少這次活動中的花銷,所以要找出可以安置所有旅客的最少的獨木舟條數。現在請寫乙個程式,讀入獨木舟的最大承載量 旅客數目和每位旅客的重量。根...