【巧妙思维】【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();
    }
}



posted on 2015-04-09 10:45  DDUPzy  阅读(113)  评论(0编辑  收藏  举报

导航