- 乘船问题:
- 有n个人,第i个人重量为Wi。每艘船的最大载重量均为C,且最多只能乘两个(很重要)人。用最少的船装载所有人。
- 怎么思考这样的问题呢?
- 1、直观思考:
- 很明显我们希望那些瘦子(wi小的人)尽量和胖子或肌肉男(wi大的人)挤一挤,为什么要这样呢,因为这样可以尽可能地省去瘦子占用的船,好,这里涉及到大小,我们可以从小到大排序之,我们希望排在前面的瘦子尽量和排在后面的肌肉男挤一挤。好,基本上,思路就出来了:
- cnt:船的数目
- 1、i向->走,j向<-走
- 2、如果能凑一起(加起来<=C),则凑一起,j--,i++;
- 3、否则,j--
- 4、直到i>=j
- i==j -> cnt++;
- i>j -> cnt;
- 但是这样的想法有bug吗?我们可以这样考虑:
- 瘦子总要乘一艘船,既然如此,不妨找一个能和他体重之和不超过C的肌肉男(当前wi尽量大的,因为这样才能尽可能保证剩余的人是尽量瘦的(wi尽量小))一起乘一艘船。
- 上面就算是直观证明吧。
#include<iostream> using namespace std; #define Maxsize 10005 float w[Maxsize]; /* Input(sorted by ascend): 6 13 2 3 6 7 11 18 Output: 4 */ int main() { int n,C ,i,j,cnt; //INPUT while(cin >> n&&cin>>C) { cnt = 0; for (i = 0;i < n;i++) { cin >> w[i]; } if (n == 1) { cout <<1 <<endl; continue; } i = 0, j = n - 1; while (i < j) { if (w[i] + w[j] <= C) { cnt++; i++; j--; } else { cnt++; j--; } } if (i == j) cout << cnt + 1<<endl; else cout << cnt<<endl; } system("pause"); return 0; }
如有错误,希望各位大佬踊跃猛怼。