我目前在算法课的作业问题上遇到了困难。指令概述如下:
用户输入整数'n'来确定测试用例的数量。 用户单独输入另一个整数'num'来确定每个测试用例中的元素数量。 用户输入各个数组的元素。
该算法必须处理数组并确定它是否可以被分成两个子序列,每个子序列都是严格递增的。如果结果为正,则程序打印"Yes",否则打印"No"。
我有24小时完成这个任务,但是我无法正确处理用户输入(想出一种算法来拆分两个子序列)。
更新:我得到了这个解决方案。它通过了4/5个测试,但未通过最后一个测试的时间限制。
用户输入整数'n'来确定测试用例的数量。 用户单独输入另一个整数'num'来确定每个测试用例中的元素数量。 用户输入各个数组的元素。
该算法必须处理数组并确定它是否可以被分成两个子序列,每个子序列都是严格递增的。如果结果为正,则程序打印"Yes",否则打印"No"。
我有24小时完成这个任务,但是我无法正确处理用户输入(想出一种算法来拆分两个子序列)。
更新:我得到了这个解决方案。它通过了4/5个测试,但未通过最后一个测试的时间限制。
#include<iostream>
#include<string>
using namespace std;
bool run(){
int numbers;
int *arr;
cin >> numbers;
arr = new int[numbers];
for (int i = 0; i < numbers; i++)
cin >> arr[i];
long long int MAX = 0;
long long int MAX2 = 0;
string stra = "";
string strb = "";
string result = "";
string total = "";
long long int sum = 0;
for (int i = 0; i < numbers; i++){
if (arr[i] >= MAX && arr[i] != arr[i - 1]){
stra += to_string(arr[i]);
MAX = arr[i];
}
else
if (arr[i] >= MAX2 && MAX2 != MAX){
strb += to_string(arr[i]);
MAX2 = arr[i];
}
}
for (int i = 0; i < numbers; i++){
result = to_string(arr[i]);
total += result;
}
long long int len1 = stra.length();
long long int len2 = strb.length();
sum += len1 + len2;
delete[] arr;
if (sum != total.length())
return false;
else
return true;
}
int main()
{
int test;
cin >> test;
while (test > 0)
{
if (run())
cout << "Yes\n";
else
cout << "No\n";
test--;
}
system("pause");
}
示例输入:
2
5
3 1 5 2 4
5
4 8 1 5 3
示例输出: 是 否
解释:对于数组3 1 5 2 4,存在两个严格递增的子序列:3 5 和 1 2 4。
NumOfTestCases
和n
都还没有初始化。请打开编译器警告并使用std::vector
。 - Quentinfor(int i...)
,内层循环隐藏了外层循环。请使用不同的变量 - 我建议您在外部循环中使用变量i_test_case
,在内部循环中使用变量i_element
代替i
。 - Sigi