水题 第四站 NYOJ Color the fence

慢慢刷水题也会遇到瓶颈,先理一遍这个题的思路吧

当时只想到要位数尽可能的多,所以必然是先考虑耗费原料少的数字,然后按照传统的贪心算法来了个排序,可敲完代码后发现不对劲,因为可以重复写一个数字,这下才发现套路的方法根本解决不了这个问题 = =,发现自己已经没有别的思路了

于是搜搜解题思路,原来这个贪心题目也是体现在使数字的位数尽可能多,于是用V/min=max位数,但是这样并不能保证最大,还要保证最大的数字排在最高位,网上的教程举了一个例子,偷懒就直接粘过来吧

我们要让能得到数尽量大,那么就要保证让位数尽量长,在位数尽量长的基础上,让高位数尽量大。除以最小的数,可以让位数最长,然而最长可以不仅仅是由最小的数得到。如:V=5,array={2,3,24,32,31,14,15,7,9},虽然可以得到最长长度是2,且由除以2可得到结果11,但是最优的结果却是21。所以只要我们能保证我们得到的高位数字比选择最小的数所得高位数字大并且位数相等即可。

捋了一遍思路,又自己独立打了一遍代码,发现有很多细节才慢慢想明白为什么要这样写,我的代码,蜜汁超时 = =

 1 //#include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <string.h>
 6 //using namespace std;
 7 
 8 int main ()
 9 {
10     int n,i;
11     int minx=100005;
12     int a[20];
13     while(~scanf("%d",&n))
14     {
15         for(i=1; i<=9; i++)
16         {
17             scanf("%d",&a[i]);
18             if(minx>=a[i])
19                 minx=a[i];
20         }
21         if (minx > n)//这里的特殊情况很容易就忘掉,我就忘了 = =,所以写完还得看题目= =
22         {
23             printf("-1\n");
24             continue;
25         }
26         //sort(a,a+9);
27         int bit=n/minx;
28         while(bit--)//保证从高位到低位尽可能每一位都选最大的数字,刚开始还不理解这个while循环
29         {
30             for(i=9; i>0; i--)//因为要大的位置优先,所以这里自然是倒序,而不是将数组进行排序
31             {
32                 if(n>=a[i]&&(n-a[i])/minx==bit)
33                 {
34                     printf("%d",i);
35                     n-=a[i];
36                     break;
37                 }
38             }
39         }
40         putchar('\n');
41     }
42     return 0;
43 }

蜜汁超时,已弃疗,附AC代码博客 http://www.cnblogs.com/ray-coding-in-rays/p/6212577.html

posted @ 2017-07-11 22:20  娇渣  阅读(184)  评论(0编辑  收藏  举报