迎接2012新赛季——HDOJ系列热身赛(5) 部分题目

今天下午航电的比赛,我没注意,下午两点多才来实验室。只是做了几道水题。

4229

就是给定那个a,b,c,d四个非负整数数,分别用|a-b| |b-c| |c-d| |d-a| 来代替,计算直到 a= = b == c == d为止求出一共需要多少步,这题幸亏给出了 It turns out that in all cases, the sequence converges very quickly. In fact, it can be shown that if all four integers are less than 2^n, then it will take no more than 3*n steps to converge! 这句话所以才刚直接做,如果没有这句的话,我想很少有人敢这样写了吧。按题意模拟记录步数即可。

4235 

给定三个数v = a*b 其中形成a,b的数是由V中的元素组成的。求大于等于给定x的满足上面条件的数;

求出所有的数然后打表处理;

View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define maxn 1000001
using namespace std;

//int f[maxn],L,t[10];
int path[10];
bool hash[10],vt[10];
bool h[maxn + 99999];
int cmp(int a,int b)
{
    return a < b;
}
int f[738] =
{
    126,153,688,1206,1255,1260,1395,1435,1503,1530,1827,2187,3159,3784,6880,10251,10255,10426,10521,10525,10575,11259,11844,11848,12006,12060,12384,12505,12546,12550,12595,12600,12762,12843,12955,12964,13243,13545,13950,14035,14350,15003,15030,15246,15300,15435,15624,15795,16272,17325,17428,17437,17482,18225,18265,18270,19026,19215,21375,21586,21753,21870,25105,25375,25474,25510,28476,29632,31509,31590,33655,33696,36855,37840,37845,39784,41665,42898,44676,45684,45760,45864,47538,48672,49855,51759,52168,53865,56295,56875,62968,63895,67149,67392,67950,68800,71199,78975,100255,100525,101299,102051,102505,102510,102541,102550,102595,102942,102955,103968,104026,104260,104368,105021,105025,105075,105210,105250,105264,105295,105723,105750,107163,107329,108126,108135,108216,108612,108864,109525,110758,112468,112509,112590,114268,115672,115699,116478,116496,116725,116928,117067,118408,118440,118480,118575,118926,119848,120006,120060,120384,120600,120762,120843,121086,121576,121815,122746,122764,123084,123354,123538,123840,123894,124483,124488,124542,124978,125005,125050,125095,125248,125433,125460,125500,125950,125995,126000,126027,126108,126846,127417,127620,128403,128430,128943,129438,129505,129514,129550,129564,129595,129640,129775,129955,131242,132430,132565,132615,132655,133245,134275,134725,135045,135450,135828,135837,136525,136854,136948,138784,139500,139824,140035,140350,141345,142978,143500,143739,143793,145273,145314,145345,145683,146137,146520,146952,149364,149782,150003,150030,150246,150300,150435,150624,150826,152271,152406,152460,152608,152685,152946,153000,153436,154350,155277,156024,156240,156289,156325,156915,157950,158193,162072,162526,162720,162976,163255,163795,163854,163944,164583,165208,168520,171598,172246,172386,172822,173250,173925,174028,174082,174208,174280,174298,174370,174793,174802,174820,174982,175329,176215,178294,178942,179325,179428,179482,180225,180297,180621,182065,182250,182650,182700,182974,184126,186624,187029,189702,189742,190260,190827,191205,192150,192375,192685,192717,193257,193945,194229,197428,197482,197725,201852,205785,207391,208624,210375,210681,210753,211896,212868,213075,213466,213750,213759,214506,215086,215424,215455,215860,216733,217503,217530,217638,217854,218488,218700,223524,226498,226872,226876,227448,229648,231579,231673,233896,236754,236758,236925,238968,241506,241564,243175,245182,245448,246150,246928,250105,250510,251005,251050,251095,251896,253750,254740,255010,255100,256315,256410,256414,258795,259510,260338,261378,261783,262984,263074,263155,263736,267034,268398,279328,281736,283198,283648,284598,284760,285376,286416,286974,287356,289674,291375,291753,293625,295105,295510,296320,297463,297832,304717,307183,312475,312565,312655,312975,314199,314743,315009,315090,315490,315594,315625,315900,316255,319059,319536,325615,326155,326452,328419,328864,329346,329656,336195,336550,336960,338296,341284,341653,342688,346288,346725,346968,347913,352966,355995,361989,362992,365638,368104,368550,368784,369189,371893,373864,375156,375615,376992,378400,378418,378450,381429,384912,384925,386415,390847,392566,393246,393417,394875,397840,399784,404932,404968,414895,415575,416065,416259,416650,416988,419287,428980,429664,435784,439582,442975,446760,446976,447916,449676,449955,450688,451768,456840,457168,457600,458640,462672,465088,465984,468535,475380,475893,476892,486720,488592,489159,489955,490176,491688,493857,495328,497682,498550,515907,516879,517509,517590,519745,520168,520816,521608,521680,526792,529672,530379,531297,535968,536539,538650,549765,559188,562950,564912,567648,568750,571648,573768,588676,611793,611878,612598,614965,617728,618759,623758,629680,632875,638950,649638,661288,665919,667876,671409,671490,671944,673920,678892,679500,687919,688000,692712,697248,702189,702918,710496,711099,711909,711990,715959,719199,729688,736695,738468,741928,769792,773896,778936,782896,785295,789250,789525,789750,791289,792585,794088,798682,809919,809937,809964,815958,829696,841995,859968,899019,936985,939658,960988,1000255,1000525,1002501,1002505,1002550,1002595,1002955,1004251,1005025,1005201,1005250,1005295,1008126,1009525,1012099,1012198,1012297,1012396,1012495,1012581,1012594,1012693,1012792,1012891,1012990,1014975,1016568,1016635,1017382,1019722,1020051,1020510,1020537,1021968,1021999,1024555,1024582,1024884,1025005,1025041,1025046,1025050,1025095,1025100,1025410,1025500,1025779,1025950,1025995,1029042,1029420,1029505,1029550,1029595,1029955,1031899,1032565,1032655,1032876,1039680,1040026,1040260,1040368,1041799,1042353,1042542,1042600,1043680,1043968,1045296,1046209,1050021,1050025,1050075,1050210,1050250,1050295,1050750,1051263,1051533,1051699,1052100,1052235,1052500,1052640,1052950,1052995,1053153,1053265,1053315,1057108,1057162,1057230,1057500,1058715,1058890,1061599,1062247,1062517,1063251,1064254,1065325,1065748,1066572,1067166,1068192,1068592,1071063,1071499,1071630,1071958,1072512,1072539,1073029,1073290,1077219,1079239,1079653,1080126,1080135,1080216,1080612,1080864,1081206,1081260,1081350,1081399,1082160,1083285,1083537,1083942,1086012,1086120,1086129,1088640,1088964,1089612,1089913,1090525,1091299,1092816,1095025,1095250,1095295,1098238,1098522,1099525
};
/*void init()
{
    int tmp[10];
    int i,j;
    memset(h,false,sizeof(h));
  for (i = 1; i <= 1000000 + 99999; ++i)
  {
     for (j = 1; j < sqrt(i); ++j)
     {
         int a = j, b = i / j;
          int l1 = 0, l2 =0;
          int c = i;
          if (a*b == c)
          {
              while  (a != 0)
              {
                  tmp[l1++] = a%10;
                  a /= 10;
              }
              while (b != 0)
              {
                   tmp[l1++] = b%10;
                   b /= 10;
              }
              while (c != 0)
              {
                  t[l2++] = c%10;
                  c /= 10;
              }
             if (l1 == l2)
             {
                 int ct = 0,k1,k2;
                 memset(hash,false,sizeof(hash));
                 for (k1 = 0; k1 < l1; ++k1)
                 {
                     for (k2 = 0; k2 < l2; ++k2)
                     {
                         if (tmp[k1] == t[k2] && !hash[k2])
                         {
                             hash[k2] = true;
                             ct++;
                             break;
                         }
                     }
                 }
                 //printf(">>>>>>%d\n",ct);
                 if (ct == l1)
                 {
                     //printf("%d %d %d\n",j,i/j,i);
                     int sum = 0;
                     for (int k = l1 - 1; k >= 0; --k)
                     sum = sum*10 + t[k];
                     if  (!h[sum])
                     {
                         h[sum] = true;
                         f[L++] = sum;
                     }
                 }
             }
          }
     }

  }
  sort(f,f + L,cmp);
  printf("%d\n",L);
  for (i = 0; i < L; ++i)
  printf("%d,",f[i]);
}*/
int main()
{
    //freopen("data.in","r",stdin);
  //L = 0;
  //init();
  int n;
  while (scanf("%d",&n),n)
  {
      for (int i = 0; i < 738; ++i)
      {
          if (f[i] >= n)
          {
              printf("%d\n",f[i]);
              break;
          }
      }
  }
  return 0;
}

4226 DP

读了很久才读懂了题意;题意是给定路径的有n段,m条路,求按指定路径走所用的最短距离;

dp[i][j] 表示地i段走第j条路的最短距离;

对于l,r他是不能换路所以有dp[i][j] = dp[i - 1][j] + w;

二对于s要求出他可以换路的范围在这个范围内求出最短路径。 (才开始自己没有用100求换路的上下界导致wa了还几次)

dp[i][j] = min(dp[i][j],dp[i - 1][j1] + w) (j1 >= s && j1 <= e)

注意k表示的是最内边与圆心的距离。

View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 1007
#define M 12
using namespace std;

const double pi = acos(-1.0);
double dp[N][M];
const double inf = 999999999.0;

int main()
{
    //freopen("data.in","r",stdin);
    int n,m,i,j;
    double k;
    char op[2];
    while (scanf("%d%d",&n,&m))
    {
        if (!n && !m) break;
        //printf("%d %d\n",n,m);
        for (i = 0; i < N; ++i)
        {
            for (j = 0; j < M; ++j)
            {
                if (i == 0) dp[i][j] = 0;
                else dp[i][j] = inf;
            }
        }
        for (i = 1; i <= n; ++i)
        {
            scanf("%s%lf",op,&k);
            //printf("%c %.2lf\n",op[0],k);
            //对于L,R只能有上一路径往下走
            if (op[0] == 'R')
            {
                    for (j = 1; j <= m; ++j)
                    {
                        dp[i][j] = dp[i - 1][j] + (pi*((j - 1)*10 +5 + k))/2.0;
                    }

            }
            else if (op[0] == 'L')
            {
                for (j = 1; j <= m; ++j)
                {
                    dp[i][j] = dp[i - 1][j] + (pi*((m - j)*10 +5 + k))/2.0;//L时注意路径的选取
                }

            }
            else
            {
                int s,e;
                for (j = 1; j <= m; ++j)
                {
                    //就是由于这一段范围贡献了好几次WA
                    int len = (k/100);
                    if (j - len > 1) s = j - len;
                    else             s = 1;
                    if (j + len > m) e = m;
                    else             e = j + len;
                    for (int j1 = s; j1 <= e; ++j1)
                    {
                        double s = (j - j1)*10;
                        double w = sqrt(k*k + s*s);
                        dp[i][j] = min(dp[i][j],dp[i - 1][j1] + w);
                    }
                }
            }
            /*for (j = 1; j <= m; ++j)
            printf("%.2lf ",dp[i][j]);
            printf("****************\n");*/
        }
        double Min = dp[n][1];
        for (i = 2; i <= m; ++i)
        {
            Min = min(Min,dp[n][i]);
        }
        printf("%.2lf\n",Min);
    }
    return 0;
}

 

posted @ 2012-04-25 20:47  E_star  阅读(312)  评论(0编辑  收藏  举报