TC SRM 582 DIV 2

Rating又跌了,第二个题,没想好就乱开始乱写了。。

我写乱搞贪心,没过。。。如果总人数很多judge函数写的不好,DIV2数据很水,直接暴力就行。

 1 #include <cstring>

 2 #include <cstdio>

 3 #include <string>

 4 #include <iostream>

 5 #include <algorithm>

 6 #include <vector>

 7 using namespace std;

 8 vector<int>::iterator it;

 9 int p[101],dp[101],o[101],n,m;

10 struct node

11 {

12     int s,num;

13 }d[101];

14 int cmp(node a,node b)

15 {

16     return a.s < b.s;

17 }

18 int judge(int x)

19 {

20     int i,j;

21     for(i = 0;i < n;i ++)

22     dp[i] = x;

23     for(i = 0;i < m;i ++)

24     {

25         o[i] = d[i].num;

26     }

27     j = n-1;

28     for(i = m-1;i >= 0;i --)

29     {

30         while(o[i])

31         {

32             if(j < 0) return 0;

33             else if(p[j] >= d[i].s&&dp[j] > 0)

34             {

35                 dp[j] --;

36                 if(dp[j] == 0)

37                 j --;

38             }

39             else if(p[j] < d[i].s)

40             return 0;

41             o[i] --;

42         }

43     }

44     return 1;

45 }

46 class SpaceWarDiv2

47 {

48 public:

49     int minimalFatigue(vector <int> magicalGirlStrength, vector <int> enemyStrength, vector <int> enemyCount)

50     {

51         int i;

52         n = 0;

53         memset(dp,0,sizeof(dp));

54         for(it = magicalGirlStrength.begin(); it != magicalGirlStrength.end(); it ++)

55         {

56             p[n++] =  *it;

57         }

58         m = 0;

59         for(it = enemyStrength.begin(); it != enemyStrength.end(); it ++)

60         {

61             d[m++].s =  *it;

62         }

63         m = 0;

64         for(it = enemyCount.begin(); it != enemyCount.end(); it ++)

65         {

66             d[m++].num =  *it;

67         }

68         sort(p,p+n);

69         sort(d,d+m,cmp);

70         if(p[n-1] < d[m-1].s) return -1;

71         for(i = 1;;i ++)

72         {

73             if(judge(i))

74             return i;

75         }

76     }

77 };

 第三题爆搜,看了一下,有人说,直接暴力+确定一个上界就可以了,然后我写了写,加了很多剪枝(有几个剪枝都是应该是正确的,其实我也不知道正确性),终于过了。。。

  1 #include <cstring>

  2 #include <cstdio>

  3 #include <string>

  4 #include <iostream>

  5 #include <algorithm>

  6 #include <vector>

  7 using namespace std;

  8 vector<int>::iterator it;

  9 int flag[10],p[10];

 10 int minz,n;

 11 void dfs(int x,int step,int num)

 12 {

 13     int i,s;

 14     if(step > minz)

 15     return ;

 16     if(num > 2*n)//移动次数不能很多

 17     return ;

 18     s = 0;

 19     for(i = 0;i < n;i ++)

 20     {

 21         if(!flag[i])

 22         {

 23             s = 1;

 24             break;

 25         }

 26     }

 27     if(s == 0)

 28     {

 29         minz = min(minz,step);

 30         return ;

 31     }

 32     if(x == 0)

 33     {

 34         if(!flag[x+1])//擦右边

 35         {

 36             flag[x+1] = step+1+p[x+1];

 37             dfs(x,step+1,num);

 38             flag[x+1] = 0;

 39         }

 40         if(step >= flag[x+1])//往右边移动

 41         {

 42             dfs(x+1,step+1,num+1);

 43         }

 44         if(flag[x+1]&&step < flag[x+1])

 45         {

 46             dfs(x,flag[x+1],num);//停留

 47         }

 48     }

 49     else if(x == n-1)

 50     {

 51         if(!flag[x-1])//擦左边

 52         {

 53             flag[x-1] = step+1+p[x-1];

 54             dfs(x,step+1,num);

 55             flag[x-1] = 0;

 56         }

 57         if(step >= flag[x-1])

 58         {

 59             dfs(x-1,step+1,num+1);

 60         }

 61         if(flag[x-1]&&step < flag[x-1])

 62         {

 63             dfs(x,flag[x-1],num);//停留

 64         }

 65     }

 66     else

 67     {

 68         if(!flag[x+1])//擦右边

 69         {

 70             flag[x+1] = step+1+p[x+1];

 71             dfs(x,step+1,num);

 72             flag[x+1] = 0;

 73         }

 74         if(!flag[x-1])//擦左边

 75         {

 76             flag[x-1] = step+1+p[x-1];

 77             dfs(x,step+1,num);

 78             flag[x-1] = 0;

 79         }

 80         if(step >= flag[x+1])//往右边移动

 81         {

 82             dfs(x+1,step+1,num+1);

 83         }

 84         if(step >= flag[x-1])

 85         {

 86             dfs(x-1,step+1,num+1);

 87         }

 88         if(flag[x-1]&&step < flag[x-1])

 89         {

 90             dfs(x,flag[x-1],num);//停留

 91         }

 92         if(flag[x+1]&&step < flag[x+1])

 93         {

 94             dfs(x,flag[x+1],num);//停留

 95         }

 96     }

 97 }

 98 class ColorTheCells

 99 {

100 public:

101     int minimalTime(vector <int> dryingTime)

102     {

103        int sum;

104        sum = 1000000000;

105        for(it = dryingTime.begin();it != dryingTime.end();it ++)

106        {

107            p[n++] = *it;

108            sum = min(sum,*it);

109        }

110        sum += n*2;//定住上界

111        minz = sum;

112        dfs(0,0,0);

113        return minz;

114     }

115 };

 

 

 

 

 

你可能感兴趣的:(div)