50分求一道ACM题SIGSEGV原因 晕了最烦这种错了

mopishv0 2008-04-02 07:25:12
http://acm.hrbeu.edu.cn/index.php?act=problem&proid=5012&cid=0

There are two sequences A and B with N (1<=N<=10000) elements each. All of the elements are positive integers. Given C=A*B, where '*' representing Cartesian product, c = a*b, where c belonging to C, a belonging to A and b belonging to B. Your job is to find the K'th largest element in C, where K begins with 1.

Input

Input file contains multiple test cases. The first line is the number of test cases. There are three lines in each test case. The first line of each case contains two integers N and K, then the second line represents elements in A and the following line represents elements in B. All integers are positive and no more than 10000.

Output

For each case output the K'th largest number.

Sample Input

2
2 1
3 4
5 6
2 3
2 1
4 8

Sample Output

24
8




#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <search.h>
using namespace std;

bool cmp ( const double a , const double b )
{
return b<a;
}

int main()
{
int num;
scanf("%d",&num);
while(num--)
{
int n,k;
scanf("%d%d",&n,&k);
vector<int>a;
for(int i=0;i<n;i++)
{
double xx;
scanf("%lf",&xx);
a.push_back(xx);
}
vector<int>b;
for(int i=0;i<n;i++)
{
double xx;
scanf("%lf",&xx);
b.push_back(xx);
}
sort(a.begin(),a.end(),cmp);
sort(b.begin(),b.end(),cmp);
double max=b[0]*a[0];
int kth=(k+1)/3;
if(k==kth*3-1&&k>1)
max=a[kth]*b[kth-1]>=a[kth-1]*b[kth]?a[kth]*b[kth-1]:a[kth-1]*b[kth];
if(k==kth*3&&k>1)
max=a[kth]*b[kth-1]<a[kth-1]*b[kth]?a[kth]*b[kth-1]:a[kth-1]*b[kth];
if(k==kth*3+1&&k>1)
max=a[kth]*b[kth];
printf("%.0lf\n",max);
}
return 0;
}


...全文
417 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
seerjk 2010-09-08
  • 打赏
  • 举报
回复
不知道里的问题啊
dartzm 2008-05-01
  • 打赏
  • 举报
回复
这种错误多半是堆栈溢出之类的错误.....
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
等待牛人来答.
soyboydoy 2008-04-21
  • 打赏
  • 举报
回复

看错题了
。。。
fallinleave 2008-04-21
  • 打赏
  • 举报
回复
数组 S 包含 n 个正数,排序后分别是 x_0, x_1, ... , x_n-1,
记 P(i, j) = x_i * x_j,则 P 是一个 n*n 的矩阵,
而且每行每列分别有序(注意我们不需要真的构造矩阵 P)。

对于给定的数组元素 C,
我们判断矩阵 P 中是否存在元素 P(i, j) = C。
如果存在,则表明 x_i * x_j = C,
从大到小的考查所有可能的 C,
即可求出满足条件的最大 C。

现在问题转化成为在一个行列分别有序的 m*n 的矩阵 P 中查找元素 C。
我们用 P(a, b, c, d)
来表示左上角坐标为(a, b)、右下角坐标为 (c, d) 的 P 的子矩阵。

结论一:矩阵的最大元素在右下角,最小元素在左上角。

结论二:若 P(0, j) < C < P(0, j+1),
则 C 一定不在子矩阵 P(0, j+1, m-1, n-1)。
(因为 P(0, j+1) 是这个子矩阵的最小元素,而 C < P(0, j+1))。

为了找到合适的 j 使得 P(0, j) < C < P(0, j+1),
依次考查元素 P(0, n-1), P(0, n-2), ..., P(0, n-floor(lgn)),
如果我们没有找到满足条件的 j,
则对所有可能的 P(0, j) 用二分法找到合适的 j。
然后可以刨除子矩阵 P(0, j+1, m-1, n-1),
在剩下的子矩阵 P(0, 0, j, n-1) 中找。

最坏情况下,我们用了 n - j 次比较,刨除掉了矩阵中的 n - j 列。
平均情况下,我们用了 O(lgn) 次比较,刨除掉了矩阵中的 n/2 列。

上面的方法其实就是在矩阵的第一行上找 C 的分界线,然后刨除掉矩阵的部分元素。
同样的,我们可以在矩阵的最后一行、第一列、最后一列上做类似的操作。
如果在矩阵的四边都不能刨掉元素,则 C 不在矩阵中,直接返回即可。

最坏情况下,我们需要 O(n) 次比较,判断 P 中是否存在 C。
平均情况下,我们需要 O((lgn)^2) 次比较,判断 P 中是否存在 C,

时间复杂度:
一共有 n 个可能的 C,故最坏 O(n^2),平均 O(n*(lgn)^2)。

空间复杂度:
不需要存储矩阵 P,需要用 P(i, j) 的时候直接计算即可,
运算过程中只需要记住子矩阵的左上角、右下角坐标,
额外空间 O(1)。
soyboydoy 2008-04-21
  • 打赏
  • 举报
回复
先计算好,用O(n)时间,用QSORT的核心函数PARTITION找出第K大的值就可以了
int findKth(int a[], int s, int e, k){
int p = partition(a, s, e, k);
if(p == k) return a[p];
if(p > k) findKth(a, s, p-1, k);
else findKth(a, p+1, e, k);
}

大致如此,我没测试过。
mopishv0 2008-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mopishv0 的回复:]
知道哪错了 但是希望大家提供个好的不超时的方法
[/Quote]
[Quote=引用 11 楼 fhtingtian 的回复:]
楼主的程序结果应该也是错的,输入
1
4 4
9 7 5 3
8 4 2 1
正确结果应该是36,程序输出结果是28
[/Quote]
已经知道了…………
bfhtian 2008-04-11
  • 打赏
  • 举报
回复
楼主的程序结果应该也是错的,输入
1
4 4
9 7 5 3
8 4 2 1
正确结果应该是36,程序输出结果是28
mopishv0 2008-04-05
  • 打赏
  • 举报
回复
10000*10000很大的
做题时应当考虑边缘数据
oo 2008-04-05
  • 打赏
  • 举报
回复
题目说是整数,为什么要用double?

mopishv0 2008-04-05
  • 打赏
  • 举报
回复
超时就是输入所有测试数据进行计算所用的时间大于规定时间
mopishv0 2008-04-05
  • 打赏
  • 举报
回复
因为最大数据量是10000
所以用双层循环会导致超时
而我的算法因为少考虑了一些情况 所以是错误的
hankman 2008-04-03
  • 打赏
  • 举报
回复
你只是取用最大的几个数据,没有必要对整个数组排序。所以可以考虑从这方面进行优化。当然,应该有一些对K的经验性判断,否则算法退化后会变成劣化。
不过,在你做优化之前,先测试一下性能瓶颈会比较好吧。
xbt746 2008-04-03
  • 打赏
  • 举报
回复
呵呵,ACM上最好不要用STL东西
ryfdizuo 2008-04-03
  • 打赏
  • 举报
回复
超时啊,
你能不能不用vector,这里的元素个数完全可以确定的嘛,直接申请内存,排序用qsort();
skineffect 2008-04-03
  • 打赏
  • 举报
回复
觉得要简化算法要用到数论的知识,比如和与积的关系等。
星羽 2008-04-02
  • 打赏
  • 举报
回复
什么叫不超时?? 你上面那个测试了是对的吗?题目好像要找出第k大的哦
mopishv0 2008-04-02
  • 打赏
  • 举报
回复
知道哪错了 但是希望大家提供个好的不超时的方法
内容概要:本资源聚焦于配电网在发生故障后的两阶段鲁棒恢复研究,旨在提升电力系统在不确定性条件下的恢复能力与运行可靠性。研究采用两阶段优化方法,第一阶段进行预恢复决策,如网络重构、分布式电源出力调整等,以最小化预期损失;第二阶段则针对实际发生的故障场景实施校正控制,利用鲁棒优化理论应对负荷波动、新能源出力不确定性等因素,确保恢复方案的可行性与强健性。资源提供了完整的Matlab代码实现,复现了相关顶刊研究成果,便于使用者深入理解模型构建、算法求解及仿真分析全过程。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员及电力行业工程师。; 使用场景及目标:① 学习并掌握配电网故障恢复的先进优化方法,特别是两阶段鲁棒优化模型的构建与应用;② 复现和验证顶刊论文中的算法,为自身科研工作提供技术参考和代码基础;③ 将所学方法拓展应用于微电网、主动配电网等新型电力系统的可靠性评估与优化调度研究。; 阅读建议:学习者应结合提供的Matlab代码,仔细研读模型的数学公式与求解逻辑,重点关注不确定性建模、两阶段决策变量的设定以及鲁棒对等转换技巧。建议在掌握基础案例后,尝试修改参数或引入新的约束条件进行扩展研究,以深化理解并提升创新能力。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧