apcs_camp 蘋果問題題解

apcs_camp 蘋果問題題解

Grissia Lv2

難到沒人懂的位元枚舉

題目

第一行有一個整數 n 表示蘋果的數量
第二行有 n 個整數表示每個蘋果的重量

請輸出將蘋果分兩籃後 兩籃最小的重量差

1
2
3
4
5
測資
5
3 2 7 4 1
輸出
1

解題思路

假設五顆蘋果分別重 2,4,5,3,1
跑一個迴圈從二進位的 0000010000 (因為 0000111110 一樣,所以沒必要檢查到 11111 )
也可以寫作 0 到小於 (1 << 5-1) (減會優先運算所以就是 1 << 4)
然後用這個二進位的位元來當作每顆蘋果進哪個籃子的依據
總之就是所有情況模擬一次拉 哈哈哈哈哈哈哈

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <bits/stdc++.h>
using namespace std;

int main(){
cin.tie(0); ios_base::sync_with_stdio(false); // cin加速器

int n;
cin >> n;
vector<long long> arr;
// 存每個蘋果重

for(int a,i = 0; i<n; i++){
cin >> a;
arr.push_back(a);
}
// 輸入蘋果

long long ans = 1e18; // 先給一個很大的數
for(int i = 0; i< (1 << n-1); i++){ // 預定一個範圍
long long sum[2] = {}; // 籃子
for(int j = 0; j<n; j++){
sum[i >> j & 1] += arr[j];
/*
喔喔喔 這東西看起來超可怕
就像前面解題思路寫的 i 可能是 01100 之類的
那 j 就是從 0 到 5-1
所以這行的意思就是把 i 從右移 j 之後檢查最後一位
如果是 1 就丟 1 號籃
如果是 0 就丟 0 號籃
*/
}
ans = min(ans,llabs(sum[0] - sum[1]));
// 計算兩籃差 是不是小於 ans
}

cout << ans << endl;
return 0;
}
  • 標題: apcs_camp 蘋果問題題解
  • 作者: Grissia
  • 撰寫于 : 2024-08-19 15:41:23
  • 更新于 : 2024-10-18 22:16:07
  • 連結: https://grissia.github.io/2024/08/19/apcs-camp-sol-1/
  • 版權宣告: 本作品采用 CC BY-NC-SA 4.0 进行许可。
此頁目錄
apcs_camp 蘋果問題題解