您的位置:首页 > 其它

Gym 100712K Runtime Error

2017-02-15 20:30 78 查看
题目

题意:给你N个数,这些数中选2个乘积为K,有多种数据的话选最大的数*最小的数。比如找最大的数 就从小到大的顺序 末尾开始找。很容易想到是两个for。 但复杂度O2。  这里就有一种降低复杂度的办法 把a[i]出现过一次记作b[a[i]]++; 等于map<a,b>  再舍去0 或者不能被整除的情况之后 再找最大的值。 除出来之后就是最小值

结果就得到最大值*最小值

下面附上代码:

#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define INF 1E4 * 1E9
#define pi acos(-1)
#define endl '\n'
#define me(x) memset(x,0,sizeof(x));
const int maxn=1e3+5;
const int maxx=1e6+5;

int a[maxx],b[maxx];
int main()
{
int T;
cin>>T;
while(T--)
{
int N,K;
cin>>N>>K;
for(int i=1;i<=N;i++)
{
cin>>a[i];
b[a[i]]++;
}
int ans=1E9;
for(int i=1;i<=N;i++)
{
if(a[i]==0||(K%a[i]!=0)) continue;
if(b[K/a[i]]>((K/a[i])==a[i]))
{
if(ans>=a[i]) ans=a[i];
}
}
if(ans==1E9) cout<<-1<<endl;
else cout<<ans<<" "<<K/ans<<endl;
me(a);me(b);
}
}

/*

4
6 12
3 6 2 4 2 9
2 1
1 2
4 36
12 18 3 36

*/

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: