c++ - 如何不多次使用一个元素?
问题描述
所以问题来了:你输入 n(2 < n < 10^6); k(-10^9 < k < 10^9); n 个从 -10^9 到 10^9 的整数。目标是找出 n 个整数中有多少对,其中总和等于 k 并打印出来。您不能多次使用这些元素。整数可以重复。我的代码是:
#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;
}
你如何跳过使用过的元素?示例 1:输入:
5 4
2 2 2 2 2
输出应该是:2(因为 2+2, 2+2) 我的是:4(2+2, 2+2, 2+2, 2+2)
示例 2:输入:
5 4
1 3 5 2 -1
我的输出: 2(since 1+3=4, 5+(-1)=4)- 这是正确的 我唯一的问题是我不能跳过使用过的元素。
解决方案
使用一个数组来保存一个元素是否已被使用(就像评论中提到的那样):
#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;
}
推荐阅读
- flutter - Flutter PageView 和 FutureBuild 每次访问页面时都会从 api 加载
- c# - nHibernate QueryOver:过滤主元素长度和子元素长度
- c# - 使用 FFMPEG 将启动画面添加到视频的开头
- javascript - 在使用异步等待时处理待处理的承诺
- c# - ASP.NET-Core 嵌套的 ASP TagHelper
- html - 如何在 Xamarin 应用程序中设置/获取 Cookie 以在 ASP Core 应用程序(都在同一解决方案中)或网站页面(Chrome/Firefox 等)中使用它?
- r - crontab:tmp/tmp.X:在 Mac OSX Mojave 上使用 `cronR` 在 RStudio 中不允许操作
- flutter - RxDart 为流中的每个项目获取项目并加入结果
- sql - 出现意外结束的 SQL 命令错误,请建议?
- python - Python:漂亮的打印带有数组 ID 的 json 文件