返回首页 返回题库

好斗的牛

C++ 中等 GESP六级真题 #排列#贪心

题目描述

题面描述

你有个牛棚,从左到右一字排开。你希望把头牛安置到牛棚里。麻烦的是,你的牛很好斗,如果他们附近有其他的牛,他们就会不安分地去挑事。其中,第头牛的攻击范围是,这意味着,如果他的左边个牛棚或右边个牛棚里有其他牛,他就会去挑事。

你想留下连续的一段牛棚,并把其他牛棚都卖掉。请问你最少需要留下多少牛棚,才能保证至少存在一种方案能够把所有的头牛都安置进剩余的牛棚里,且没有牛会挑事?

输入格式

第一行1个正整数。

接下来一行个用空格隔开的正整数。

接下来一行个用空格隔开的正整数。

输出格式

输出一行一个整数,表示你最少需要留下多少牛棚。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。

样例1

输入:

2
1 2
1 2

输出:

4

样例解释1

你可以留下4个牛棚,并如此安排你的牛:

| 牛棚1 | 牛棚2 | 牛棚3 | 牛棚4 |
|-------|-------|-------|-------|
| 牛1   |       |       | 牛2   |

样例2

输入:

3
1 2 3
3 2 1

输出:

7

数据范围

  • 对于20%的测试点,保证 ;
  • 对于另外20%的测试点,保证 ;
  • 对于80%的测试点,保证 ;
  • 对于所有测试点,保证 ,。

时间限制

1秒

内存限制

128MB

💡 查看提示(先自己想一想再看)
本题核心考察全排列枚举与贪心计算。因为N最大为9,全排列的总数量为9!=362880,在时间限制内完全可以枚举所有可能的牛排列顺序。对于每一种排列顺序,相邻两头牛之间需要的间隔为max(前一头牛的b值,后一头牛的a值),累加所有间隔与牛本身占用的N个位置即可得到当前排列对应的最小牛棚长度,取所有排列的最小值即为答案。需要注意使用next_permutation前要先将排列初始化为升序,才能遍历所有全排列。
⚙ 开始做这道题 0 人做过 · 0 收藏 · 3 浏览

讨论(0)