Description
将一个给定的数列,拆分成K个不降序列,每个数出现且只出现一次,且在各序列中各个数相对于原数列的相对顺序不变。
如7 6 9 8 10可以拆成 7 9 10和6 8。求最小的K值。
Input
第一行输入一个整数T(1 <= T <= 100),表示接下来T组测试数据,
每组两行,第一行为n,代表数列长度(1<=n<=10000)
接下来一行有n个数,空格分隔(每个数<=50000)。
Output
对每组数据输出一个最小的K值。
Sample Input
2
5
7 6 9 8 10
5
5 4 3 2 1
Sample Output
2
5
将一个给定的数列,拆分成K个不降序列,每个数出现且只出现一次,且在各序列中各个数相对于原数列的相对顺序不变。
如7 6 9 8 10可以拆成 7 9 10和6 8。求最小的K值。
Input
第一行输入一个整数T(1 <= T <= 100),表示接下来T组测试数据,
每组两行,第一行为n,代表数列长度(1<=n<=10000)
接下来一行有n个数,空格分隔(每个数<=50000)。
Output
对每组数据输出一个最小的K值。
Sample Input
2
5
7 6 9 8 10
5
5 4 3 2 1
Sample Output
2
5
解题思路:本题就是一个纯贪心问题,只要我们对该数组进行一个遍历就可以来对每一个数进行分类,找到小于等于它的序列就行。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10010;
int num[maxn];
int t,n;
int ans;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ans = 0;
memset(num,0,sizeof(num));
while(n--)
{
int x,i;
scanf("%d",&x);
for(i=0;i<=ans;i++)
{
if(x>=num[i]){
num[i] = x;
break;
}
}
if(i==ans+1)
num[++ans] = x;
}
printf("%d\n",ans+1);
}
return 0;
}

本文介绍了一种使用贪心策略解决数列拆分问题的方法。目标是将给定的数列拆分成尽可能少的不降子序列,同时保持元素间的相对顺序不变。通过遍历数列并为每个元素分配合适的子序列,最终实现最小化子序列数量的目标。
10万+

被折叠的 条评论
为什么被折叠?



