【巧妙思维】【4-6】Problem F
题意:有n个正方体,边长为A[i] 当A[k]-A[p]<=lim 时 k可以放在p上面,
问有多少种放法;
一开始被数据范围吓到了 ,以为是n^3算法,答案是nlogn
从小到大排序,一个一个插入,因为从小到大,所以插入一个元素时,只要管插入位置前面的元素大小关系,不用管后面的(相减一定<=0)
直接乘法原理即可
(1+k1)(1+k2).....k1即排序后 ,K[i]表示排序后 前面与A[i]相减小于lim的元素个数
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <ctime> #include <algorithm> #include <iostream> #include <sstream> #include <string> #define oo 0x13131313 using namespace std; const int maxn=1111; int n,lim; int A[maxn]; void input() { for(int i=1;i<=n;i++) scanf("%d",&A[i]); } void solve() { int ans=1; sort(A+1,A+n+1); for(int i=1;i<=n;i++) { int tot=1; for(int j=1;j<i;j++) { if(A[i]-A[j]<=lim) tot++; } ans=(ans*tot)%10007; } printf("%d\n",ans); } void init() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); } int main() { // init(); while(cin>>n>>lim) { input(); solve(); } }