题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输入:
每个测试案例包括两行:
第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”
样例输入:
6 15
1 2 4 7 11 15
样例输出:
4 11

今天状态真是差劲
一开始的代码如下
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; int num[]; int main(int argc, char const *argv[])
{
int n, k;
while(scanf("%d %d",&n,&k) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
int iptr = ;
int mina = -, minb = -;
while(iptr < n) {
int p = k - num[iptr];
int t = lower_bound(num, num + n, p) - num;
if(num[t] == p && t > iptr) {
mina = num[iptr];
minb = p;
break;
}
iptr++;
}
printf("%d %d\n",mina, minb);
}
return ;
}

思路很简单,用二分搜索找到另一个值在数组中的位置。结果反复提交都是错误

问题:lower_bound返回的是num[i]>=p的指针的最小值,

如果输入

5 2

1 1 1 2 5就会出错

改正

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; int num[]; int main(int argc, char const *argv[])
{
int n, k;
while(scanf("%d %d",&n,&k) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
int iptr = ;
int mina = -, minb = -;
while(iptr < n && num[iptr] * <= k) {
int p = k - num[iptr];
int t = upper_bound(num, num + n, p) - num - ;
if(num[t] == p && t > iptr) {
mina = num[iptr];
minb = p;
break;
}
iptr++;
}
printf("%d %d\n",mina, minb);
}
return ;
}

其实此题还有一种更好的解法

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; int num[]; int main(int argc, char const *argv[])
{
int n, k;
while(scanf("%d %d",&n,&k) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
int low = , high = n-;
int mina = -, minb = -;
while(low < high) {
if(num[low] + num[high] == k) {
mina = num[low];
minb = num[high];
break;
}
else if(num[low] + num[high] < k) {
low++;
}
else {
high--;
}
}
printf("%d %d\n",mina, minb);
}
return ;
}

注意找到的第一个便是乘积最小的!!!

最新文章

  1. ubuntu 16.04 设置位wifi热点 方法(手机可链接)亲测可用
  2. 【PHP面向对象(OOP)编程入门教程】4.如何抽象出一个类?
  3. [转]OpenVPN 安装与配置
  4. springMVC图片文件上传功能的实现
  5. iOS学习—JSON数据解析
  6. Web Penetration Testing 渗透 通信信息安全
  7. 将dataset写入数据库
  8. PHP类的自动载入机制
  9. Map的遍历方法及String和其它类型的相互转化
  10. js中window.print()去除页眉页脚
  11. Ffmpeg和SDL如何同步视频(转)
  12. 高效的SQLSERVER分页查询(推荐)
  13. SSL与TLS的区别以及介绍(转)
  14. Windows查看端口被哪个进程占用
  15. Jmeter遇到的坑
  16. GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
  17. django 连接mysql
  18. Redis 5种主要数据类型和命令
  19. opencart3修改产品页模板没有效果的原因排查
  20. 基于MMSE的预测

热门文章

  1. mongodb Gridfs操作
  2. WebService学习之旅(四)Apache Axis2的安装
  3. Android 权限的实现
  4. 测试ReplicaSets读写分离和故障转移
  5. 洛谷 P1204 [USACO1.2]挤牛奶Milking Cows
  6. codevs 1313 质因数分解
  7. ABC3D创客项目:小风扇
  8. leetcode_1033. Moving Stones Until Consecutive
  9. C#背景图片自适应
  10. 关于 QObject 类