题目描述
你有 10910^9109 个牛棚,从左到右一字排开。你希望把 nnn 头牛安置到牛棚里。麻烦的是,你的牛很好斗,如果他们附近有其他的牛,他们就会不安分地去挑事。其中,第 iii 头牛的攻击范围是 (ai,bi)(a_i, b_i)(ai,bi),这意味着,如果他的左边 aia_iai 个牛棚或者右边 bib_ibi 个牛棚有其他牛,它就会去挑事。
你想留下一段连续的牛棚,并把其他牛棚都卖掉。请问您最少需要留下多少牛棚,才能保证至少存在一种方案能够把所有的 nnn 头牛都安置进剩余的牛棚里,且没有牛会挑事?
输入格式
第一行一个正整数 nnn。
第二行 nnn 个正整数 a1,a2,…ana_1, a_2, \dots a_na1,a2,…an。
第三行 nnn 个正整数 b1,b2,…bnb_1, b_2, \dots b_nb1,b2,…bn。
输出格式
输出一行一个整数表示答案。
输入输出样例 #1
输入 #1
2
1 2
1 2
输出 #1
4
输入输出样例 #2
输入 #2
3
1 2 3
3 2 1
输出 #2
7
说明/提示
样例 1 解释
留下第 1、2、3、4 个牛棚,并在第 111、444 两个牛棚分别放下两头牛。
数据规模与约定
- 对 20%20\%20% 的数据,保证 n=2n = 2n=2。
- 另有 20%20\%20% 的数据,保证 n=3n = 3n=3。
- 对 80%80\%80% 的数据,保证 n≤8n \leq 8n≤8。
- 对于所有的测试数据,保证 1≤n≤91 \leq n \leq 91≤n≤9,1≤ai,bi≤1031 \leq a_i, b_i \leq 10^31≤ai,bi≤103。
solution
感觉可以用贪心,到那时数据量很小,直接枚举了
代码
#include <iostream>
#include "bit"
#include "vector"
#include "unordered_set"
#include "set"
#include "queue"
#include "algorithm"
#include "bitset"
using namespace std;
const int N = 2e5 + 2;
int n, a[10], b[10], c[10], ans = 1e9;
void f(int i) {
if (i == n) {
int s = 1;
for(int j = 1; j < n; j++){
s += max(b[c[j - 1]], a[c[j]]) + 1;
}
ans = min(ans, s);
return;
}
for (int k = i; k < n; k++) {
swap(c[i], c[k]);
f(i + 1);
swap(c[i], c[k]);
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i], c[i] = i;
f(0);
cout << ans;
}