您的位置:首页 > 产品设计 > UI/UE

南京理工大学第八届程序设计大赛(校外镜像) - sequence (贪心)

2016-04-18 12:45 399 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ acm