标签:
题意:
给n个数,和m,问从n个数中选出两个数x,y使得x+y<=m的方法有多少种,xy顺序无关。
思路:
预处理所有的数,默认x<y来枚举。
对于一个x,使得满足条件的y一定是 [x,m-y]范围内的。就算一下有多少个数。
然后单独算一下相等的情况。
代码:
#include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #include"iostream" #include"map" using namespace std; #define ll __int64 int v[1000002],a[25448]; int main() { int n,s; while(scanf("%d%d",&n,&s)!=-1) { memset(v,0,sizeof(v)); for(int i=0;i<n;i++) { int x; scanf("%d",&x); a[i]=x; v[x]++; } for(int i=0;i<=1000000;i++) v[i]+=v[i-1]; sort(a,a+n); int ans=0; for(int i=0;i<n;i++) { if(a[i]>=s/2) break; ans+=v[s-a[i]]-v[a[i]]; } for(int i=1;i<=1000000;i++) { int tep=v[i]-v[i-1]; if(i>s/2) break; if(!tep) continue; ans+=tep*(tep-1)/2; } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/wdcjdtc/article/details/45560529