一天不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[N];
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[N];
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果然慢啊~