GCJ2015 Problem B. Infinite House of Pancakes

我这个弱B

一开始就认为对于一个数, 对半分肯定比其他的分配方案好,然后最终也没过

对半分不一定是最好的分配方案,比如, 9 可能分成3个3比对半分好

真不知道那些大牛是怎么思考问题的,我看了第一的代码,他枚举最终状态的最大值, 他是怎么思考问题的呢?

下面这个我改的蔡的暴力代码, 加上了枚举每一种分法,目前能过小数据, 大数据超时应该

 1 #include<cstdio>

 2 #include<iostream>

 3 #include<cstring>

 4 

 5 using namespace std;

 6 

 7 int a[1005];

 8 int n;

 9 

10 int minTime(int i) {

11         int j;

12         for(j = i; j >= 1; j-- ) {

13                 if(a[j] > 0)

14                         break;

15         }

16         if(j <= 1) {

17                 return 1 == j && a[j] > 0 ? 1 : 0;

18         }

19 

20         int ans = j;

21         for (int x = 1; x <= (j >> 1); ++x) {

22                 a[x] += a[j];

23                 a[j - x] += a[j];

24                 int tmp = a[j] + minTime(j - 1);

25                 ans = ans > tmp ? tmp : ans;

26                 a[x] -= a[j];

27                 a[j - x] -= a[j];

28         }

29 

30         return  ans;

31 }

32 

33 int main() {

34         int T;

35         cin >> T;

36         for (int cas = 1; cas <= T; ++cas) {

37                 cin >> n;

38                 memset(a, 0, sizeof(a));

39                 for (int i = 0; i < n; ++i) {

40                         int p;

41                         cin >> p;

42                         ++a[p];

43                 }

44                 int ans = minTime(1000);

45                 cout << "Case #" << cas << ": " << ans << endl;

46         }

47         return 0;

48 }

 下面这个是大神的代码, 我留做纪念

1             int min = 10000;

2             for (int lim = 1; lim <= counts.length; lim++)

3             {

4                 int moves = 0;

5                 for (int i = 0; i < counts.length; i++)

6                     moves += ((i - 1) / lim) * counts[i]; //这个i-1我也是醉了

7                 if (moves + lim < min)

8                     min = moves + lim;

9             }

 

你可能感兴趣的:(init)