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 };

 

 

 

 

 

posted @ 2013-06-16 21:03  Naix_x  阅读(239)  评论(0编辑  收藏  举报