算法习题---4-9数据挖掘(Uva1591)

一:题目

这是最懵逼的一道题,什么鬼.........

[刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string>

unsigned int N, Sp, Sq, A_min, B_min;    
//1<= N <=2^20是P,Q两个数组的元素个数,1 <= Sq,Sp <= 2^10分别是两个数组每个元素所占字节大小,所以两个数组分别最大占2^30字节
unsigned long long Qofs, Pofs, K;
//由公式偏移可以知道Pofs原来可能是2^30,先向左偏移会越界,所以选用一个较大的数据类型来存放

//重点:Qofs按照格式可以知道偏移量是同Pofs一样递增,而且按照题目所说,使用偏移公式,Q数组可以不连续,而且不会重叠
//因为Pofs最大30位,所以偏移不会超过30位,因此最大不会超过60位

void main()
{
    FILE* fp = freopen("data9.in", "r", stdin);
    freopen("data9.out", "w", stdout);

    while (!feof(fp))
    {
        scanf("%d %d %d", &N, &Sp, &Sq);
        K = 0xffffffffffffffff,A_min = B_min = 32;    //64位
        Pofs = (N-1)*Sp;    //直接是P数组最大偏移值去获取Q数组最大偏移值,从而获取K最小值
        
        for (int A = 0; A < 32; A++)
        {
            for (int B = 0; B < 32;B++)
            {
                Qofs = (Pofs + (Pofs << A) >> B)+Sq;  //按照上面文章所说,书上公式是错误的额,这个公式是对的
                if (Qofs < K && Qofs >= N*Sq)    //找到的第一个最小K,获取的A,B就是最小的,我们不需要设置<=k去判断后面的AB值,没有必要
                {
                    K = Qofs;
                    A_min = A;
                    B_min = B;
                }
            }
        }
        printf("%llu %u %u\n", K, A_min, B_min);
        getchar();
    }

    freopen("CON", "r", stdin);
    freopen("CON", "w", stdout);
}

 

转载于:https://www.cnblogs.com/ssyfj/p/11174605.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值