题意:给定一组正整数,允许把数组切成若干连续的“块”,对每一块单独排序后再按原顺序拼接,要求拼接后的整个数组是从小到大有序,问最多能切成多少块。
核心想法:
i 后面切一刀(左边是 0..i 这一块,右边是 i+1..n-1)。有一队学生,每名学生都持有一个写有正整数的号码牌。
现在需要按照学生在队伍中的先后顺序,将整条队伍划分为若干个连续的组。每名学生必须且只能属于其中一组,并且每组至少包含一名学生。
对于每一组,将组内学生按照号码牌上的数字从小到大重新排列,然后按照各组在原队伍中的先后顺序依次拼接。
如果最终得到的号码序列,与将整条队伍直接按照号码牌数字从小到大排序后得到的序列完全相同,则称这种分组方案是合法的。
请计算:在所有合法的分组方案中,最多可以分成多少组。
约束条件:
学生总人数,即输入的正整数个数,满足:
1≤n≤500
输入包含若干个正整数,以空白字符分隔。
这些正整数按照从前到后的顺序,依次表示队伍中每名学生号码牌上的数字。
输出一个整数,表示在满足条件的情况下,最多可以将队伍分成多少组。
输入
5
输出
1
说明
队伍中只有 1 名学生,号码牌上的数字为 5。
因此只能将这名学生单独分为一组。组内排序后仍然是 5,与整条队伍排序后的结果相同。
所以最多可以分成 1 组。
输入
1 2 3 4
输出
4
说明
原队伍的号码已经按照从小到大的顺序排列:
1 2 3 4
可以让每名学生单独成为一组,共分成:
[1] [2] [3] [4]
每组内部排序后都不会发生变化,按照原来的组序拼接后仍然得到:
1 2 3 4
与整条队伍直接排序后的结果完全相同。
因此最多可以分成 4 组。
输入
4 3 2 1
输出
1
说明
整条队伍排序后应得到:
1 2 3 4
如果将队伍分成两个或更多组,那么一定存在某个相邻组的分界位置,使得前面的组中包含较大的号码,而后面的组中包含较小的号码。
由于只能在每组内部进行排序,不能改变不同组之间的先后顺序,因此这些较大的号码仍然会出现在较小号码之前,最终无法得到整体升序序列。
所以只能将整条队伍分为一组。对这一组排序后可以得到:
1 2 3 4
因此最多可以分成 1 组。
输入
3 2 1 5 4
输出
2
说明
整条队伍排序后应得到:
1 2 3 4 5
可以将队伍分成以下两组:
[3 2 1] [5 4]
分别对两组内部排序后得到:
[1 2 3] [4 5]
按照两组原来的先后顺序拼接,得到:
1 2 3 4 5
与整条队伍直接排序后的结果完全相同,因此这种分组方案是合法的。
如果继续将其中的组拆分成更多组,例如将 [3 2 1] 分成多个连续的组,那么前面的某一组中会保留较大的号码,而后面的组中会出现较小的号码。由于不同组之间的顺序不能改变,即使分别对组内排序,也无法得到整体升序序列。
因此最多可以分成 2 组。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册