C++ 如何不多次使用元素?
问题是:输入n(2C++ 如何不多次使用元素?,c++,C++,问题是:输入n(2k; 整数[n]; 对于(int i=0;i>数字[i]; } int结果=0; 对于(int j=0;jn; 标准:cin>>k; std::向量v(n); 用于(自动和电气:v){ 标准:cin>>e; } 排序(v.begin(),v.end()); if(v.empty()) { std::cout 1)我们不做作业2)如果不是,请告诉我们出错的原因排序输入,然后使用线性解决方案(两个迭代器,一个从开始,一个从结束)。1)这不是作业,很久以来一直在尝试解决这个难题(我不
#include <iostream>
using namespace std;
int main(){
int n;
int k;
cin >> n;
cin >> k;
int numbers[n];
for (int i = 0; i < n; i++){
cin >> numbers[i];
}
int result = 0;
for (int j = 0; j < n; j++){
for (int l = j + 1; l < n; l++){
if (numbers[j] + numbers[l] == k){
result += 1;
break;
}
}
}
cout << result;
return 0;
}
输出应为:
2(自2+2、2+2起)
我的建议是:
4(2+2,2+2,2+2,2+2)
例2:
输入:
我的输出:
2(因为1+3=4,5+(-1)=4)-哪个是正确的
我唯一的问题是我不能跳过已使用的元素。使用一个数组,在该数组中保存元素是否已使用(如注释中所述):
#包括
使用名称空间std;
//包含10^6个元素的数组,
//(==最大数量的数字)
布尔使用了[1000000];
int main(){
int n;
int k;
cin>>n;
cin>>k;
整数[n];
对于(int i=0;i>数字[i];
}
int结果=0;
对于(int j=0;j cout您可能要做的是对输入进行排序,并从两侧进行线性处理。
(这也将复杂性从O(n²)
降低到O(n log n)
)
intmain(){
int n;
int k;
标准:cin>>n;
标准:cin>>k;
std::向量v(n);
用于(自动和电气:v){
标准:cin>>e;
}
排序(v.begin(),v.end());
if(v.empty())
{
std::cout 1)我们不做作业2)如果不是,请告诉我们出错的原因排序输入,然后使用线性解决方案(两个迭代器,一个从开始,一个从结束)。1)这不是作业,很久以来一直在尝试解决这个难题(我不熟悉编码).2)所有元素只能使用一次,但正如您所看到的,在下一个for循环中,已经使用的元素仍然有效。问题是我无法“清除”元素,因此它仍然可用,从而导致错误的结果整数[n]无效的C++,因为它使用VLA扩展。使用<代码> STD::向量< /代码>。如果它不是一个家庭作业,比最简单的解决方案(最古老的解决方案)就是使用一个标志。标志始终为0,但当找到一个元素时,它会被设置为1。只有当标志为0时,才能检查新元素。在序列检查完成后,请记住再次将标志设置为零。谢谢,这非常有帮助!但有些输出似乎不正确。2int
之类的限制是错误的输入这些限制,您至少需要std::int32\t
。这些限制在这里是为了知道要使用的类型和预期的复杂性。啊,我明白了。另外,当我在C++11上运行代码时,它会说“24:17:警告:有符号和无符号整数表达式之间的比较[-Wsign compare]”。这是怎么回事?它应该是std::size\u t left=0;
因为auto
被推断为int
,而right
的类型与v.size()相同。
。
5 4
2 2 2 2 2
5 4
1 3 5 2 -1
#include <iostream>
using namespace std;
//array with 10^6 elements,
//(== max number of numbers)
bool used[1000000];
int main(){
int n;
int k;
cin >> n;
cin >> k;
int numbers[n];
for (int i = 0; i < n; i++){
cin >> numbers[i];
}
int result = 0;
for (int j = 0; j < n; j++){
//check if element has been used
if(used[j] == 1) {
continue;
}
for (int l = j + 1; l < n; l++){
//check if element has been used
if(used[l] == 1 ) {
continue;
}
if (numbers[j] + numbers[l] == k){
//mark elements as used
used[j] = 1;
used[l] = 1;
result += 1;
break;
}
}
}
cout << result;
return 0;
}
int main(){
int n;
int k;
std::cin >> n;
std::cin >> k;
std::vector<int> v(n);
for (auto& e : v){
std::cin >> e;
}
std::sort(v.begin(), v.end());
if (v.empty())
{
std::cout << 0;
return 0;
}
std::size_t counter = 0;
auto left = 0;
auto right = v.size() - 1;
while (left < right) {
const auto sum = v[left] + v[right];
if (sum < k) {
++left;
} else if (k < sum) {
--right;
} else { // sum == k
// It is here that we may have special handling to handle duplicates
// when v[left] == v[left+1].
// Here, it is simple, no special cases :-)
++counter;
++left;
--right;
}
}
std::cout << counter;
}