• 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 };
  • 相关阅读:
    《架构之美》读后感(二)
    《架构之美》读后感(一)
    《代码大全2》阅读笔记03
    《代码大全2》阅读笔记02
    《代码大全2》阅读笔记01
    学习进度报告(十四)
    软件方法阅读笔记03
    第二讲
    1.26 十讲第一讲
    1.23
  • 原文地址:https://www.cnblogs.com/naix-x/p/3137993.html
Copyright © 2020-2023  润新知