pku1245-1251 Mid-Central USA 2002 比赛总结

pku1245-1251 Mid-Central USA 2002 比赛总结

第二次做比赛,有了viaxl的加入,有点动力

Solved ID Title
Ratio(AC/att)
Yes Problem A Programmer, Rank Thyself
100.0%(3/3)

Problem B Hilbert Curve Intersections
0.0%(0/0)
Yes Problem C Magnificent Meatballs
100.0%(2/2)
Yes Problem D Safecracker
100.0%(1/1)
Yes Problem E Oil Pipeline
50.0%(1/2)
Yes Problem F Tanning Salon
100.0%(1/1)
Yes Problem G Jungle Roads
100.0%(1/1)
其实这6道题都很水。。USA的比赛一向没有难度的

pku1245 Programmer, Rank Thyself
一道裸的排序题,不过我还是犯了一个错误。。lna 1+lna 2+..+lna n,我试图先将a1,a2..an乘起来,不想每注意到越界了。。
代码:  
 1  Source Code
 2 
 3  Problem:  1245         User: yzhw
 4  Memory: 584K        Time: 16MS
 5  Language: G ++         Result: Accepted
 6  Source Code
 7  // ============================================================================
 8  //  Name        : A.cpp
 9  //  Author      : yzhw
10  //  Version     :
11  //  Copyright   : yzhw
12  //  Description : Hello World in C++, Ansi-style
13  // ============================================================================
14 
15  # include  < cstdio >
16  # include  < cstring >
17  # include  < cmath >
18  # include  < algorithm >
19  # include  < vector >
20  using   namespace  std;
21  struct  node
22  {
23       char  name[ 15 ];
24       int  accept,time,mean,rank;
25      vector < int >  data;
26       void  init()
27      {
28          accept = 0 ;
29          time = 0 ;
30          mean = 0 ;
31          data.clear();
32      }
33       void  add( int  t)
34      {
35          data.push_back(t);
36           if (t)
37          {
38              time += t;
39              accept ++ ;
40          }
41      }
42       void  cal()
43      {
44           if ( ! accept)  return ;
45           double  total = 0 ;
46           for ( int  i = 0 ;i < data.size();i ++ )
47               if (data[i])
48                  total += log(data[i]);
49          mean = 0.5 + exp(total / accept);
50      }
51       bool   operator < ( const  node & pos)  const
52      {
53           if (accept != pos.accept)  return  accept > pos.accept;
54           else   if (time != pos.time)  return  time < pos.time;
55           else   if (mean != pos.mean)  return  mean < pos.mean;
56           else   return  strcmp(name,pos.name) < 0 ;
57      }
58       bool   operator == ( const  node  & pos)  const
59      {
60           return  accept == pos.accept && time == pos.time && mean == pos.mean;
61      }
62       void  print()
63      {
64          printf( " %s%d %-10s%2d%5d%4d " ,rank < 10 ? " 0 " : "" ,rank,name,accept,time,mean);
65           for ( int  i = 0 ;i < data.size();i ++ )
66              printf( " %4d " ,data[i]);
67          printf( " \n " );
68      }
69  }team[ 25 ];
70  int  main() {
71       int  n;
72       for ( int  test = 1 ;scanf( " %d " , & n) && n;test ++ )
73      {
74           for ( int  i = 0 ;i < n;i ++ )
75          {
76              scanf( " %s " ,team[i].name);
77              team[i].init();
78               for ( int  j = 0 ;j < 7 ;j ++ )
79              {
80                   int  t;
81                  scanf( " %d " , & t);
82                  team[i].add(t);
83              }
84              team[i].cal();
85          }
86          sort(team,team + n);
87          team[ 0 ].rank = 1 ;
88           for ( int  i = 1 ;i < n;i ++ )
89               if (team[i] == team[i - 1 ])
90                  team[i].rank = team[i - 1 ].rank;
91               else
92                  team[i].rank = i + 1 ;
93          printf( " CONTEST %d\n " ,test);
94           for ( int  i = 0 ;i < n;i ++ )
95              team[i].print();
96      }
97       return   0 ;
98  }

pku1247  Magnificent Meatballs
简单数学,看下奇偶性就可以了
代码:
 1  Source Code
 2 
 3  Problem:  1247         User: yzhw
 4  Memory: 704K        Time: 0MS
 5  Language: G ++         Result: Accepted
 6  Source Code
 7  // ============================================================================
 8  //  Name        : Magnificent.cpp
 9  //  Author      : yzhw
10  //  Version     :
11  //  Copyright   : yzhw
12  //  Description : Hello World in C++, Ansi-style
13  // ============================================================================
14 
15  #include  < iostream >
16  using   namespace  std;
17 
18  int  main() {
19       int  data[ 35 ],n;
20       while (cin >> n && n)
21      {
22          data[ 0 ] = 0 ;
23           for ( int  i = 1 ;i <= n;i ++ )
24          {
25              cin >> data[i];
26              data[i] += data[i - 1 ];
27          }
28           if (data[n] % 2 ) cout << " No equal partitioning. " << endl;
29           else
30          {
31               bool  flag = false ;
32               for ( int  i = 1 ;i <= n;i ++ )
33                   if (data[i] == data[n] / 2 )
34                  {
35                      flag = true ;
36                      cout << " Sam stops at position  " << i << "  and Ella stops at position  " << i + 1 << " . " << endl;
37                       break ;
38                  }
39               if ( ! flag) cout << " No equal partitioning. " << endl;
40          }
41      }
42       return   0 ;
43  }

pku 1248 Safecracker
一道很裸的回溯,不说了,直接代码
 1  Source Code
 2 
 3  Problem:  1248         User: yzhw
 4  Memory: 696K        Time: 0MS
 5  Language: G ++         Result: Accepted
 6  Source Code
 7  // ============================================================================
 8  //  Name        : Safecracker.cpp
 9  //  Author      : yzhw
10  //  Version     :
11  //  Copyright   : yzhw
12  //  Description : Hello World in C++, Ansi-style
13  // ============================================================================
14 
15  #include  < iostream >
16  #include  < cstring >
17  #include  < algorithm >
18  using   namespace  std;
19  bool  used[ 26 ];
20  int  target;
21  char  res[ 6 ];
22  bool  search( int  pos, int  num)
23  {
24       if (pos == 5 )
25          return  num == target;
26       else
27      {
28           for ( int  i = 25 ;i >= 0 ;i -- )
29               if ( ! used[i])
30              {
31                  used[i] = true ;
32                  res[pos] = i + ' A ' ;
33                   switch (pos)
34                  {
35                   case   0 :
36                       if (search(pos + 1 ,num + i + 1 ))  return   true ;
37                       break ;
38                   case   1 :
39                       if (search(pos + 1 ,num - (i + 1 ) * (i + 1 )))  return   true ;
40                       break ;
41                   case   2 :
42                       if (search(pos + 1 ,num + (i + 1 ) * (i + 1 ) * (i + 1 )))  return   true ;
43                       break ;
44                   case   3 :
45                       if (search(pos + 1 ,num - (i + 1 ) * (i + 1 ) * (i + 1 ) * (i + 1 )))  return   true ;
46                       break ;
47                   case   4 :
48                       if (search(pos + 1 ,num + (i + 1 ) * (i + 1 ) * (i + 1 ) * (i + 1 ) * (i + 1 )))  return   true ;
49                       break ;
50                  }
51                  used[i] = false ;
52              }
53           return   false ;
54      }
55  }
56  int  main() {
57       char  str[ 20 ];
58       while (cin >> target >> str && (target || strcmp(str, " END " )))
59      {
60          memset(used, true , sizeof (used));
61           for ( int  i = 0 ;str[i] != ' \0 ' ;i ++ )
62              used[str[i] - ' A ' ] = false ;
63          res[ 5 ] = ' \0 ' ;
64           if (search( 0 , 0 )) cout << res << endl;
65           else  cout << " no solution " << endl;
66      }
67       return   0 ;
68  }

PKU1250 Tanning Salon
算是模拟吧,如果题目中没有这句“ Customers who leave without tanning always depart before customers who are currently tanning.”可能会难一点- -,思路直接看代码吧- -
 1  Source Code
 2 
 3  Problem:  1250         User: yzhw
 4  Memory: 708K        Time: 0MS
 5  Language: G ++         Result: Accepted
 6  Source Code
 7  // ============================================================================
 8  //  Name        : Tanning.cpp
 9  //  Author      : yzhw
10  //  Version     :
11  //  Copyright   : yzhw
12  //  Description : Hello World in C++, Ansi-style
13  // ============================================================================
14 
15  #include  < iostream >
16  #include  < cstring >
17  using   namespace  std;
18 
19  int  main() {
20       int  n;
21       char  str[ 100 ];
22       bool  used[ 26 ];
23       while (cin >> n && n)
24      {
25           int  ans = 0 ;
26          cin >> str;
27          memset(used, false , sizeof (used));
28           for ( int  i = 0 ;str[i] != ' \0 ' ;i ++ )
29               switch (used[str[i] - 65 ])
30              {
31               case   true :
32                  used[str[i] - 65 ] = false ;
33                  n ++ ;
34                  ans ++ ;
35                   break ;
36               case   false :
37                   if (n)
38                  {
39                      n -- ;
40                      used[str[i] - 65 ] = true ;
41                  }
42                   break ;
43              };
44               if (ans == strlen(str) / 2 )
45                  cout << " All customers tanned successfully. " << endl;
46               else
47                  cout << strlen(str) / 2 - ans << "  customer(s) walked away. " << endl;
48      }
49       return   0 ;
50  }

pku1251 Jungle Road

pku1245-1251 Mid-Central USA 2002 比赛总结_第1张图片
这个像什么?最小生成树?对了,直接拍代码吧:
 1  Source Code
 2 
 3  Problem:  1251         User: yzhw
 4  Memory: 696K        Time: 16MS
 5  Language: G ++         Result: Accepted
 6  Source Code
 7  // ============================================================================
 8  //  Name        : Jungle.cpp
 9  //  Author      : yzhw
10  //  Version     :
11  //  Copyright   : yzhw
12  //  Description : Hello World in C++, Ansi-style
13  // ============================================================================
14 
15  #include  < iostream >
16  #include  < algorithm >
17  #include  < vector >
18  using   namespace  std;
19  struct  node
20  {
21       int  a,b;
22       int  len;
23      node( int  first, int  second, int  length):a(first),b(second),len(length){}
24       bool   operator < ( const  node  & pos)  const
25      {
26           return  len < pos.len;
27      }
28  };
29  vector < node >  edge;
30  int  n, set [ 26 ];
31  int  find( int  pos)
32  {
33       if ( set [pos] == pos)  return  pos;
34       else   return   set [pos] = find( set [pos]);
35  }
36  int  main() {
37       while (cin >> n && n)
38      {
39          edge.clear();
40           for ( int  i = 0 ;i < n;i ++ set [i] = i;
41           for ( int  i = 0 ;i < n - 1 ;i ++ )
42          {
43               int  num;
44               char  ori;
45              cin >> ori >> num;
46               while (num -- )
47              {
48                   char  to;
49                   int  len;
50                  cin >> to >> len;
51                  edge.push_back(node(ori - ' A ' ,to - ' A ' ,len));
52              }
53          }
54          sort(edge.begin(),edge.end());
55           int  c = 0 ,ans = 0 ;
56           for ( int  i = 0 ;i < edge.size() && c < n - 1 ;i ++ )
57               if (find(edge[i].a) != find(edge[i].b))
58              {
59                   set [find(edge[i].a)] = find(edge[i].b);
60                  ans += edge[i].len;
61                  c ++ ;
62              }
63          cout << ans << endl;
64      }
65       return   0 ;
66  }

pku1249 Oil Pipeline

这题稍微烦点,其实也不难
怎么确定最优值?范围才不到100?枚举+动态更新~排下序就发现复杂度O(nm)
怎么画图?自己看着办吧,我是先画边框,再画管道,最后画点
trick?如果y坐标只有1位的话注意了?
代码:
  1  Source Code
  2 
  3  Problem:  1249         User: yzhw
  4  Memory: 548K        Time: 16MS
  5  Language: G ++         Result: Accepted
  6  Source Code
  7  // ============================================================================
  8  //  Name        : Oil.cpp
  9  //  Author      : yzhw
 10  //  Version     :
 11  //  Copyright   : yzhw
 12  //  Description : Hello World in C++, Ansi-style
 13  // ============================================================================
 14 
 15  # include  < cstdio >
 16  # include  < vector >
 17  # include  < cstring >
 18  # include  < algorithm >
 19  using   namespace  std;
 20  vector < int >  data[ 100 ];
 21  int  x,y,minx,maxx,miny,maxy;
 22  int  GetMin( int  pos)
 23  {
 24       int  ans = pos / 5 * 5 ;
 25       if (ans == pos) ans -= 5 ;
 26       return  ans;
 27  }
 28  int  GetMax( int  pos)
 29  {
 30       return  (pos / 5 + 1 ) * 5 ;
 31  }
 32  int  main() {
 33       // freopen("ans.txt","w",stdout);
 34       int  c = 0 ;
 35       while ( true )
 36      {
 37 
 38          scanf( " %d%d " , & x, & y);
 39           if (x == 0 && y == 0 break ;
 40           for ( int  i = 1 ;i <= 94 ;i ++ ) data[i].clear();
 41          data[x].push_back(y);
 42          minx = maxx = x;
 43          miny = maxy = y;
 44           while ( true )
 45          {
 46              scanf( " %d%d " , & x, & y);
 47               if (x ==- 1 && y ==- 1 break ;
 48              data[x].push_back(y);
 49              minx = min(minx,x);
 50              maxx = max(maxx,x);
 51              miny = min(miny,y);
 52              maxy = max(maxy,y);
 53          }
 54           for ( int  i = minx;i <= maxx;i ++ )
 55              sort(data[i].begin(),data[i].end());
 56           int  total = 0 ,ans = 1 ;
 57           for (y = 1 ;y <= 73 ;y ++ )
 58             if (y == 1 )
 59            {
 60               for ( int  i = minx;i <= maxx;i ++ )
 61                   if ( ! data[i].empty())
 62                      {
 63                           if (y >= data[i].front() && y <= data[i].back()) total = data[i].back() - data[i].front();
 64                           else   if (y > data[i].back()) total = data[i].back() - data[i].front() + y - data[i].back();
 65                           else  total = data[i].back() - data[i].front() + data[i].front() - y;
 66                      }
 67              ans = y;
 68            }
 69             else
 70            {
 71                 int  tmp = total;
 72                 for ( int  i = minx;i <= maxx;i ++ )
 73                     if ( ! data[i].empty())
 74                        {
 75                             if (y > data[i].front() && y <= data[i].back());
 76                             else   if (y <= data[i].front()) tmp -- ;
 77                             else  tmp ++ ;
 78                        }
 79                 if (tmp < total)
 80                    total = tmp,ans = y;
 81            }
 82           // print
 83          printf( " OIL FIELD %d\n " , ++ c);
 84           int  left = GetMin(minx),right = GetMax(maxx),down = GetMin(miny),up = GetMax(maxy);
 85           if (right - left > 70 || up - down > 20 ) printf( " Map is too big to draw for pipeline at %d\n " ,ans);
 86           else
 87          {
 88               char  orimap[ 100 ][ 100 ];
 89              memset(orimap, ' . ' , sizeof (orimap));
 90               char   * map[ 100 ];
 91               for ( int  i = 0 ;i < 100 ;i ++ )
 92                  map[i] = orimap[i];
 93               // draw left border&right border
 94               for ( int  i = down;i <= up;i ++ )
 95              {
 96                   if ((i - down) % 5 == 0 )
 97                  {
 98                      sprintf(map[up - i], " %2d+ " ,i);
 99                      sprintf( & orimap[up - i][right - left + 2 ], " + " );
100                  }
101                   else
102                  {
103                      sprintf(map[up - i], "   | " );
104                      sprintf( & orimap[up - i][right - left + 2 ], " | " );
105                  }
106                  map[up - i] += 3 ;
107                   * map[up - i] = ' . ' ;
108              }
109               // draw up&down border
110              sprintf(orimap[up - down + 1 ], "   %-5d " ,left);
111              map[up - down + 1 ] += 7 ;
112               for ( int  i = left + 1 ;i < right;i ++ )
113              {
114                   if ((i - left) % 5 == 0 )
115                  {
116                      sprintf(map[up - down + 1 ], " %-5d " ,i);
117                      map[up - down + 1 ] += 5 ;
118                       * map[up - down] =* map[ 0 ] = ' + ' ;
119                  }
120                   else
121                  {
122                       * map[up - down] =* map[ 0 ] = ' - ' ;
123                  }
124                  map[up - down] ++ ;
125                  map[ 0 ] ++ ;
126              }
127              sprintf(map[up - down + 1 ], " %d " ,right);
128               // draw N-S line
129               for ( int  i = down + 1 ;i < up;i ++ )
130                  map[up - i] += minx - left - 1 ;
131               for ( int  i = minx;i <= maxx;i ++ )
132              {
133                   if ( ! data[i].empty())
134                       for ( int  j = min(ans,data[i].front());j <= max(ans,data[i].back());j ++ )
135                           * map[up - j] = ' * ' ;
136                   for ( int  j = down + 1 ;j < up;j ++ )
137                      map[up - j] ++ ;
138              }
139               // draw S-E line
140               for ( int  i = left + 1 ;i < right;i ++ )
141                  orimap[up - ans][ 2 + i - left] = ' * ' ;
142 
143               // draw point
144               for ( int  i = minx;i <= maxx;i ++ )
145                   for ( int  j = 0 ;j < data[i].size();j ++ )
146                      orimap[up - data[i][j]][i - left + 2 ] = ' @ ' ;
147               for ( int  i = up;i >= down - 1 ;i -- )
148                  printf( " %s\n " ,up < 10 ? orimap[up - i] + 1 :orimap[up - i]);
149          }
150      }
151       return   0 ;
152  }

你可能感兴趣的:(pku1245-1251 Mid-Central USA 2002 比赛总结)