算法習題---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);
}
相關文章
相關標籤/搜索