题意:有n个班级,问两个不同班级的IQ智商加起来大于K值的有多少个方案。
思路:开始想的就是用每一个人的IQ去比较其他班级的人IQ,虽然也用到了二分查找,但是TLE了。
然后这道题的思路是用:所有的两两IQ大于K值的总和减去同一班级内两两IQ大于K值的总和。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=120;
const int maxm=1200;
int w[maxm];
int num[maxm][maxn];
long long sum;
int n,k;
int chazhao(int c,int x)
{
if(x>k)
return w[c];
int l=0,r=w[c];
int mid;
x=k-x;
while(l<r)
{
mid=(l+r)/2;
if(num[c][mid]>x)
r=mid;
else
l=mid+1;
}
return w[c]-r;
}
long long jisuan(int x,int c)
{
long long cnt=0;
for(int i=c+1;i<n;i++)
{
cnt+=chazhao(i,x);
}
return cnt;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&w[i]);
for(int j=0;j<w[i];j++)
{
scanf("%d",&num[i][j]);
}
sort(num[i],num[i]+w[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<w[i];j++)
{
sum+=jisuan(num[i][j],i);
// printf("%d ",jisuan(num[i][j],i));
}
// puts("");
}
printf("%lld\n",sum);
}
return 0;
}