习题4-9 数据挖掘 UVa1591

算法竞赛入门经典(第2版)第4章 函数和递归

题4-9 数据挖掘  UVa1591

感悟。

1、从网站下载英文原题,重点在看输入输出数据与格式。

2、英文题目大意是看懂了,但本题的核心在于弄懂输入输出数据处理,目前还没有头绪,不知所云。

3、对(where K<=N*SQ)有疑惑,那样例1的输入输出如何解释,119<=20*5???

4、没有拘泥于3、的问题,对样例1进行模拟,竟然成功了,分享如下:

输入:20 3 5

输出:119 0 0

Qofs(i)=Pofs(i)+Pofs(i)=2Pofs(i)

P     数据(起点):0(0)1(3)2(6)3(9)4(12)...N-1(3N-1)

Q   数据(起点) :  0(0)1(6)2(12)3(18)4(24)...N-1(6N-6)

K=6*19+5=119

结论:英文题目有误,(where K<=N*SQ)应改成(where K>=N*SQ)。公式(4)的关键是Q的数据内存没有交叠the fast formula(4) will give non-overlapping storage locations for each of the N records of array Q.。

5、此题开始尝试样例2:

输入:1024 7 1

输出:1119 2 5

Qofs(i)=(Pofs(i)+Pofs(i)*4)/32=5Pofs(i)/32

P     数据(起点):0(0)1(7)2(14)3(21)4(28)...N-1(7(N-1))

Q   数据(起点) :  0(0)1(1)2(2)3(3)4(4)...N-1(7*(N-1)*5/32)

K=7*1023*5/32+1=1119

6、对样例1的处理过程进行如下:

Qofs(0)=(Profs(0)+Profs(0)*2^A)/2^B

5<=(3+3*2^A)/2^B

A=0

3+3*2^0=6>5,(3+3*2^0)/2^0=6>5(最小);(3+3*2^0)/2^1=3<5;A=0,B=0。

A=1

3+3*2^1=9>5,(3+3*2^1)/2^0=9>5;(3+3*2^1)/2^1=4.5<5(大);因9>6,故取上方的A=0,B=0。

7、对样例2的处理过程进行如下:

Qofs(0)=(Profs(0)+Profs(0)*2^A)/2^B

1<=(7+7*2^A)/2^B

A=0

7+7*2^0=14>1,(7+7*2^0)/2^0=14>1;(7+7*2^0)/2^1=7>1;(7+7*2^0)/2^2=3>1;(7+7*2^0)/2^3=7/4>1.

A=1

7+7*2^1=21>1,(7+7*2^1)/2^0=21>1;(7+7*2^1)/2^1=10>1;(7+7*2^1)/2^2=5>1;(7+7*2^1)/2^2=5>1(7+7*2^1)/2^3=2>1;

(7+7*2^1)/2^4=21/16>1(大).

A=2

7+7*2^2=35>1,(7+7*2^2)/2^0=35>1;(7+7*2^2)/2^1=17>1;(7+7*2^2)/2^2=8>1;(7+7*2^2)/2^3=4>1;

(7+7*2^2)/2^4=2>1;(7+7*2^2)/2^5=35/32(最小).(7+7*2^1)/2^2=5>1;(7+7*2^1)/2^2=5>1(7+7*2^0)/2^3=7/4>1.

A=3

7+7*2^3=63>1,(7+7*2^3)/2^0=63>1;(7+7*2^3)/2^1=31>1;(7+7*2^3)/2^2=15>1;(7+7*2^3)/2^3=7>1;

(7+7*2^3)/2^4=3>1;(7+7*2^3)/2^5=63/32(大).

故A=2 B=5

8、可以开始编码。样例通过后,提交WA。

9、参考http://blog.csdn.net/code4101/article/details/38540759#t17说A、B值都在0~31以内;本人猜测在20以内,当然错误,还有就是int不够用了,要用long long。

10、修改,提交WA,下载测试数据http://neerc.ifmo.ru/past/2003.html。

11、从http://blog.csdn.net/code4101/article/details/38540759#t17拷贝代码,提交AC,开始进行对拍。

12、为了方便读者对拍,提供部分测试数据如下:

1000889 105 966
1004073 115 711
1007966 824 176
1017709 6 912
1021168 187 573
1025618 66 869
1029623 132 928
1029727 60 546
1030074 48 318
103136 47 981
1037479 796 9
1041006 236 912
1041765 222 840
1042437 318 961
1044935 50 383
1045889 65 650
105383 950 236
110116 231 731
121336 13 149
131177 298 995
137619 923 67
142186 109 654
149809 152 588
15292 124 427
155603 123 879
157707 82 784
158650 22 411
16430 178 921
169176 224 810
173220 69 548
175888 161 1009
17797 76 753
179490 19 181
183323 1015 10
185664 282 1007
187225 38 402
201189 82 307
202234 167 651
202390 55 373
202824 102 523
204473 72 759
206310 200 744
208229 253 826
20921 14 711
211564 93 925
211611 18 208
211852 52 763
212750 749 468
224009 36 440
23087 437 517
233361 100 773
235922 12 444
238466 186 700
241224 8 746
241551 1 76
24466 82 251
256942 14 961
259655 227 760
265687 121 900
269598 86 293
270037 656 550
275011 248 987
278137 127 15
278615 25 679
288710 300 933
300240 257 841
303949 229 890
305604 216 776
310082 256 915
31016 856 217
311663 132 721
313084 298 1006
313463 5 578
322344 996 84
322828 111 702
323116 34 915
324872 874 45
326773 959 29
333144 96 719
335462 69 930
336423 709 360
343208 566 327
345679 95 521
346081 94 576
35062 1 187
351697 127 723
353618 112 371
353948 28 728
35439 152 866
357498 78 927
358970 956 15
369735 239 903
372529 70 508
374421 324 979
379699 243 834
379875 55 634
382941 518 66
383630 6 239
384010 172 321
385215 725 28
387032 170 743
389181 43 926
389548 161 614
391255 286 959
396300 160 854
397136 28 983
398760 19 826
399729 26 913
402320 131 88
40308 92 323
407521 278 850
408324 31 114
409557 89 980
409574 680 698
410372 145 822
417100 956 18
42006 149 838
425132 4 529
426019 115 582
435093 406 870
438571 152 956
442430 277 955
449266 277 918
451331 34 316
451816 165 985
452467 223 768
452601 84 873
453834 18 634
454703 120 774
456879 158 504
459197 84 781
464965 171 227
467087 126 1001
470980 115 845
473061 233 730
476503 22 285
481628 13 214
485685 81 510
486215 45 371
491075 96 559
491782 28 723
492545 220 851
505645 272 966
507700 86 781
50968 902 99
511184 236 901
513458 80 800
518832 115 834
520300 169 872
526371 68 922
527 136 780
531524 175 579
53338 28 116
53717 2 1021
542945 98 502
545588 35 366
545938 2 287
547004 664 5
549030 126 634
551 274 840
556483 20 511
559372 139 905
563118 287 1006
570645 32 645
572662 122 872
579522 170 997
580147 29 178
581192 172 650
582803 217 831
58727 888 890
587344 80 414
589671 72 911
592667 133 493
605884 23 471
606523 81 803
615934 934 1005
617241 49 712
618989 229 830
620654 111 1018
622608 98 978
627494 74 857
627620 9 280
627942 829 52
628508 437 449
63250 251 765
634913 8 110
641440 24 490
641871 259 982
642048 8 742
651463 13 983
653604 21 596
65781 204 726
658261 73 782
662455 234 716
663498 58 382
666484 155 586
667166 63 201
670940 171 550
671167 315 991
67459 53 969
674712 896 234
681305 85 676
681433 359 12
683447 77 1001
684530 135 945
686989 57 679
692020 142 555
692654 130 425
701551 118 785
70494 47 3
709496 56 379
711261 2 459
713115 154 464
717059 926 277
722130 141 893
722623 186 761
729867 3 764
731098 14 520
731613 246 976
737662 145 728
740417 50 721
745238 56 1016
748243 139 534
75383 877 115
756956 70 799
765045 170 606
774894 753 28
775217 202 1019
776167 42 539
779356 32 793
780659 14 981
784355 56 767
785159 364 184
786423 318 999
788198 45 789
793789 63 971
794772 36 630
795770 90 343
795829 75 476
795888 957 6
796757 2 488
797908 5 945
798241 212 743
803472 5 100
806109 19 887
808399 15 218
80942 11 1016
811263 70 510
812617 263 907
81544 41 301
816074 23 652
816490 332 1014
816967 100 399
820379 97 28
830415 152 1006
832678 138 824
834417 891 973
83912 158 507
841078 50 519
842083 32 951
844766 287 873
850970 207 752
851386 5 816
852157 110 795
857141 6 949
860156 374 263
861037 87 829
863094 73 660
865918 50 915
86932 20 985
873883 166 939
874443 127 454
876801 362 800
876927 471 444
878063 39 886
878407 73 771
878757 111 294
878913 111 569
879400 95 988
881164 174 560
884133 594 159
88454 270 1015
884701 36 978
887178 185 590
888290 134 998
900709 235 937
90121 196 780
903154 268 819
904357 153 972
905573 173 947
906950 82 260
908613 277 871
909207 150 800
909490 19 324
91268 240 789
914982 16 303
91894 283 983
924795 96 968
925350 25 559
926466 73 581
930090 152 911
934654 38 407
936195 35 756
936914 76 885
939073 49 780
943982 116 619
944223 155 824
957466 35 779
964734 10 115
966485 68 978
973691 271 881
974766 697 756
976637 173 1012
977008 117 689
977652 48 571
982846 254 823
992567 24 1016
994239 50 713
99677 274 794
998209 91 622

13、以其中一组数据为例,进行跟踪排错,

998209 91 622

AC代码输出:   726696046 30 27

本人代码输出: 726696046 31 28

从本人程序角度,结果应该没问题,开始阅读上述AC代码,看一看实现方式与本人的不同之处。

14、将AC代码,英文文章对照着读,突然顿悟,AC代码与本人K值都是相同的,在A有多解的情况下,选小的。错误找到啦。

15、明白了此题选择的第一关键是K,第二关键是A,第三关键是B;其它都不是关键。

16、对拍,FC: 找不到差异,提交代码WA,看看时间2016-11-12 22:35.傻眼了。

17、将AC代码拷入本人程序,采用拼接替换的办法进行测试,发现k值正确,继续测试,发现A值正确,继续测试,发现B值错误。

18、想不明白:

// if((result>=sq)&&((result/2)<sq)){ //此句WA ,即存在是sq两倍,三倍的最小值,目前还想不明白,待日后解决2016-11-13 16:45
                    if(result>=sq){ //此句AC
19、提交代码AC,目前此题还未清楚的想明白。2016-11-13 16:50,暂告一个段落。

20、发现了一个比较快的网站http://vjudge.net,可以在里面进行UVa问题的提交,它与UVa网站的答案是否一致,还有待验证。

附上AC代码(内含两种办法),编译环境Dev-C++4.9.9.2

#include <stdio.h>
#include <math.h>

//暴力法,穷举 猜测A<30 B<30 因为N<=2^20 Sp<=2^10 Sq<=2^10 整数范围2^31 此句猜想错误,为警示,未删
#define maxn 32

struct mining{
    long long a;
    long long b;
    long long k;
    double s;
}out[maxn*maxn],minout;
int main(){
    long long n,sp,sq;
    long long i,j;
    long long number,result;//int 改成 long long
    long long count;
    long long k;
    while(scanf("%lld%lld%lld",&n,&sp,&sq)!=EOF){
        //方法一
        count=0;
        for(i=0;i<maxn*maxn;i++){
            out[i].a=n*sq<<10;
            out[i].b=n*sq<<10;
            out[i].k=n*sq<<10;
            out[i].s=n*sq<<10;
        }
        for(i=0;i<maxn;i++){
            number=sp+(sp<<i);
            if(number>=sq){
                for(j=0;j<maxn;j++){
                    result=number>>j;
                   // if((result>=sq)&&((result/2)<sq)){ //此句WA ,即存在是sq两倍,三倍的最小值,目前还想不明白,待日后解决2016-11-13 16:45
                    if(result>=sq){ //此句AC
                        out[count].a=i;
                        out[count].b=j;
                        out[count].k=((n-1)*(sp+(sp<<i))>>j)+sq;//AC的原因应该以该值最小进行选择
                        out[count].s=number*1.0/pow(2,j);//WA的原因是一直以该值最小进行选择 ,为警示,未删除该句
                        count++;
//                        break;//此处应删除
                    }
                }
            }
        }
        minout=out[0];
        for(i=0;i<count;i++){
            if(out[i].k<minout.k)
                minout=out[i];
        }
        printf("%lld %lld %lld\n",minout.k,minout.a,minout.b);
        //方法二
/*        minout.k=n*sq<<10;
        for(i=0;i<maxn;i++){
            for(j=0;j<maxn;j++){
                number=(sp+(sp<<i))>>j;
                if(number>=sq){
                    k=((n-1)*sp+((n-1)*sp<<i)>>j)+sq;
                    if(k<minout.k){
                        minout.a=i;
                        minout.b=j;
                        minout.k=k;
                    }
                }
            }
        }
        printf("%lld %lld %lld\n",minout.k,minout.a,minout.b);*/
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值