Problem
一个集合包含一组相互不同的数字。现在我们要去寻找一个集合,他要满足如下性质:
对于所有 𝑥(𝑥∈𝑆) ,要满足l ≤ x ≤ r;
1 ≤ |S| ≤ k;
设S中第i个元素是 𝑠𝑖 ;那么 𝑓(𝑆)=𝑠1 ⨁ 𝑠2 ⨁ ... ⨁ 𝑠|𝑆| 的值要尽可能小。
Solution
k=1,答案为l。
k=2,如果偶数-奇数存在为1,但有特殊情况,答案为两者异或和和两个数取最小。
k=3,至少有三个连续的数,则必然<=1,只需要找是否为0,两个数异或不可能为0,考虑l的最高位,记为第i位,如果要全消除,则另外两个数第i位必有1个1,1个0,又第i位为0的数不可能比l小,则此数i+1位为1,那么第i位为1的数第i+1位也为1。
即: 1 1 0 0 0 0 0 0 1 0 X X X X X X 1 X X X X X X ——左边界l
k=4,如果可以选择的数大于4个直接为0,否则4个数暴力找。
Code
| 12
 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
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 | #include<stdio.h>#include<set>
 #include<iostream>
 #include<algorithm>
 
 typedef long long ll;
 typedef long double ld;
 typedef double db;
 #define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
 using namespace std;
 ll l, r, k;
 ll a[10];
 
 int main() {
 io_opt;
 cin >> l >> r >> k;
 if (k == 1) {
 cout << l << endl;
 } else if (k == 2) {
 if (r - l + 1 == 2) {
 cout << min(l, min(r, l ^ r));
 } else {
 cout << "1" << endl;
 }
 } else if (k == 3) {
 int cnt = 0;
 while (l) {
 cnt++;
 l >>= 1;
 }
 if ((3LL << (cnt - 1)) <= r) {
 cout << "0" << endl;
 } else {
 cout << "1" << endl;
 }
 } else {
 if (r - l + 1 > 4) {
 cout << "0" << endl;
 } else {
 a[1] = l, a[2] = l + 1, a[3] = l + 2, a[4] = l + 3;
 ll ans = 1;
 ans = min(ans, a[1] ^ a[2] ^ a[3]);
 ans = min(ans, a[1] ^ a[2] ^ a[4]);
 ans = min(ans, a[1] ^ a[3] ^ a[4]);
 ans = min(ans, a[4] ^ a[2] ^ a[3]);
 ans = min(ans, a[1] ^ a[2] ^ a[3] ^ a[4]);
 cout << ans << endl;
 }
 }
 return 0;
 }
 
 |