Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39844
  • 博文数量: 22
  • 博客积分: 1130
  • 博客等级: 少尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-11 17:20
文章分类

全部博文(22)

文章存档

2010年(3)

2009年(19)

我的朋友
最近访客

分类:

2009-11-08 21:41:28

排序+ 二分  比较耗时

//8004K    2110MS

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

typedef long long BigInt;
const int MAX=1250001;
BigInt A[MAX];
BigInt F[102];
int a1,a2,a3,a4,a5;
int ans;
int record;

void Find(BigInt& t)
{
    int i;
    int low=1;
    int high=A[0];
    int mid;
    while(low<high){
        mid=(low+high)/2;
        if(A[mid]==t){
            record++;
            break;
        }
        else if(A[mid]<t)
            low=mid+1;
        else
            high=mid-1;
    }
    for(i=mid+1;i<=A[0]&&A[i]==t;i++)
        record++;

    for(i=mid-1;i>=1&&A[i]==t;i--)
        record++;
}

int main()
{
    int num=0;
    for(int i=-50;i<=50;i++){
        if(i!=0)
            F[++num]=i*i*i;
    }
    F[0]=num;
    while(scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5)==5){
        if(a1==0&&a2==0&&a3==0&&a4==0&&a5==0){
            printf("10000000000\n");
            continue;
        }
        int num=0;
        for(int i=1;i<=F[0];i++){
            for(int j=1;j<=F[0];j++){
                for(int k=1;k<=F[0];k++){
                    BigInt t=a1*F[i]+a2*F[j]+a3*F[k];
                    A[++num]=t;
                }
            }
        }
        A[0]=num;
        sort(A+1,A+1+A[0]);
        ans=0;
        for(int i=1;i<=F[0];i++){
            for(int j=1;j<=F[0];j++){
                BigInt t=-(a4*F[i]+a5*F[j]);
                record=0;
                Find(t);
                ans+=record;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


阅读(685) | 评论(0) | 转发(0) |
0

上一篇:POJ 2376

下一篇:POJ 1650

给主人留下些什么吧!~~