sequence
Time Limit: 1000MS
Memory Limit: 65536KB
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
标准题解:
经典贪心问题,从前往后扫描原数组,每到一个数,找个当前最大值最大的不降数组加入其中,否则新建一个不降数组。
不降子序列包括相等的情况….没注意WA了几次,惜败。
交的时候担心会出负数,所以标记值取了-50000。
就酱。
代码:
include <iostream>
using namespace std;
int main()
{
int t;
cin >> t;
long long int list[10050] = {0};
while(t--)
{
int n ;
cin >> n;
for(int i = 0; i < n; i++)
cin >> list[i];
/*for(int i = 0; i < n; i++)
cout << list[i] << " ";
cout << endl;*/
int max = -50000;
int count = 0;
for(int i = 0; i < n; i++)
{
if(list[i] != -50000)
{
count++;
for(int j = i; j < n; j++)
{
if(list[j] >= max)
{
max = list[j];
list[j] = -50000;
}
}
max = -50000;
}
}
cout << count <<endl;
}
return 0;
}