您的位置:首页 > 其它

hdu2578Dating with girls(1)(二分查找或者STL map)

2013-05-16 19:36 274 查看
一天不A题,赶不上YYD~

->题目请戳这里<-

题目大意:给n个正整数,从中任选一个有序对<x,y>使x + y = k;k给定。

题目分析:水题一枚~数据量给的100000,先排个序,再二分即可,复杂度nlogn;详情请见代码:

#include <iostream>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

const int N = 100005;

int lcm
;
int n,k;

int find(int x)
{
int l,r,mid;
l = 0;
r = n - 1;
while(l <= r)
{
mid = (l + r)>>1;
if(lcm[mid] == x)
return 1;
else
{
if(lcm[mid] > x)
r = mid - 1;
else
l = mid + 1;
}
}
return 0;
}

int main()
{
int i,t;
scanf("%d",&t);
while(t --)
{
scanf("%d%d",&n,&k);
for(i = 0;i < n;i ++)
{
scanf("%d",&lcm[i]);
}
sort(lcm,lcm + n);
int ans = 0;
/*for(i = 1;i < 10;i ++)
if(find(i))
printf("%d\n",i);*/
//system("pause");
if(find(k - lcm[0]))
ans ++;
for(i = 1;i < n;i ++)
{
if(lcm[i] == lcm[i - 1])
continue;
if(find(k - lcm[i]))
ans ++;
}
printf("%d\n",ans);
}
return 0;
}
//656MS 456K

其实这题时限很宽,用STL的map也可以水过~详情请见代码:
#include <iostream>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

const int N = 100005;

map<int,int> mp;
int lcm
;
int len;
int n;
int k;

int main()
{
int i,t,a;
scanf("%d",&t);
while(t --)
{
scanf("%d%d",&n,&k);
mp.clear();
len = 0;
for(i = 0;i < n;i ++)
{
scanf("%d",&a);
if(mp[a] != 1)
{
mp[a] = 1;
lcm[len ++] = a;
}
}
int ans = 0;
for(i = 0;i < len;i ++)
{
if(mp[k - lcm[i]] == 1)
ans ++;
}
printf("%d\n",ans);
}
return 0;
}
//1843MS 1696K

PS:STL果然方便啊,STL果然慢啊~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分 水题