正文

Zju 1163 The Staircases2006-12-18 23:19:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/21695.html

分享到:

2174729 2006-12-18 23:13:20 Accepted 1163 C++ 00:00.02 2384K Crux.D

    很好的一道dp题,积压已久。这让我想起小学生时代的作文了:

   “今天我又做了一件好事,我真高兴呀。”

    这道题的陷阱是大数,用double即可避过。方程是b[i][k] = b[i - k][k - 1],i代表N,k代表最高层的块数。然后把b[i][k]累加起来就可。

    另外这题只用了23行,和今天做的另一道题1111比起来,简直是他喵的奇迹。那道题整整花了我半个下午,调试了3次,写了400多行……

#include <cstdio>
#include <string>

double a[505][505];

int main()
{
 int i, k, n;
 memset(a, 0x00, sizeof(a));
 a[0][0] = 1;
 for(i = 0; i < 505; i ++)
 {
  for(k = 1; k <= i; k ++)
   a[i][k] = a[i - k][k - 1] + a[i][k - 1];
  for(k = i + 1; k < 505; k ++)
   a[i][k] = a[i][i];
 }
 while(scanf("%d", &n) && n)
 {  
  printf("%0.0f\n", a[n][n] - 1);
 }
 return 0;
}

----------------------------

对比的程序,zju 1111

#include <iostream>
#include <string>
using namespace std;

int bw, ww, tie, t_b, t_w;

struct card
{
 int v, s;
} b[5], w[5];


void pc(card *a)
{
 int i;
 for(i = 0; i < 5; i ++)
 {
  printf("%d ", a[i].v, a[i].s);
 }
 printf("\n");
}

void print()
{
 pc(b); pc(w);
 printf("%d %d\n", t_b, t_w);
}

int high(card *a)
{
 int i, sum = 0;
 for(i = 0; i < 5; i ++)
 {
  sum *= 14;
  sum += a[i].v;
 }
 return sum;
}

void atoc(string str, card &c)
{
 int sv, ss;
 if(str[0] == 'A')
  sv = 13;
 else if(str[0] == 'T')
  sv = 9;
 else if(str[0] == 'J')
  sv = 10;
 else if(str[0] == 'Q')
  sv = 11;
 else if(str[0] == 'K')
  sv = 12;
 else
  sv = str[0] - '0' - 1;
 if(str[1] == 'C')
  ss = 0;
 else if(str[1] == 'D')
  ss = 1;
 else if(str[1] == 'H')
  ss = 2;
 else if(str[1] == 'S')
  ss = 3;
 c.s = ss, c.v = sv;
}

void s_sort(card *a)
{
 int i, k, j, mx;
 for(i = 0; i < 4; i ++)
 {
  j = i, mx = a[j].v;
  for(k = i + 1; k < 5; k ++)
  {
   if(a[k].v > mx)
   {
    mx = a[k].v;
    j = k;
   }
  }
  int tv, ts;
  tv = a[j].v, ts = a[j].s;
  a[j].v = a[i].v, a[j].s = a[i].s;
  a[i].v = tv, a[i].s = ts;
 }
}
 
int str_flush(card *a)
{
 int i;
 for(i = 0; i < 5; i ++)
 {
  if(a[i].s != a[0].s)
   return 0;
  if(a[i].v != a[0].v - i)
   return 0;
 }
 return a[0].v;
}

int four_kind(card *a)
{
 int i, l[14];
 memset(l, 0, sizeof(l));
 for(i = 0; i < 5; i ++)
 {
  l[a[i].v] ++;
 }
 for(i = 0; i < 14; i ++)
 {
  if(l[i] == 4)
  {
   return i;
  }
 }
 return 0;
}

int full_house(card *a)
{
 int i, l[14], tp = 0, db = 0;
 memset(l, 0, sizeof(l));
 for(i = 0; i < 5; i ++)
 {
  l[a[i].v] ++;
 }
 for(i = 1; i <= 13; i ++)
 {
  if(l[i] == 3) tp = i;
  if(l[i] == 2) db = i;
  if(l[i] == 1) return 0;
 }
 if(tp && db) return tp;
}

int one_flush(card *a)
{
 int i;
 for(i = 0; i < 5; i ++)
 {
  if(a[i].s != a[0].s)
   return 0;
 }
 return high(a);
}

int straight(card *a)
{
 int i;
 for(i = 0; i < 5; i ++)
 {
  if(a[i].v != a[0].v - i)
   return 0;
 }
 return a[0].v;
}

int tp_kind(card *a)
{
 int i, l[14];
 memset(l, 0, sizeof(l));
 for(i = 0; i < 5; i ++)
 {
  l[a[i].v] ++;
 }
 for(i = 0; i < 14; i ++)
 {
  if(l[i] == 3)
   return i;
 }
 return 0;
}

int db_db(card *a)
{
 int i, l[14], sum = 0, d[2], t;
 memset(l, 0, sizeof(l));
 for(i = 0; i < 5; i ++)
 {
  l[a[i].v] ++;
 }
 for(i = 0; i < 14; i ++)
 {
  if(l[i] == 2) d[sum ++] = i;
  if(l[i] == 1) t = i;
 }
 if(sum == 2)
  return (d[1] * 14 + d[0]) * 14 + t;
 return 0;
}

int db_kind(card *a)
{
 int i, l[14], f = 0, d[5], sum = 0;
 memset(l, 0, sizeof(l));
 for(i = 0; i < 5; i ++)
 {
  l[a[i].v] ++;
 }
 for(i = 0; i < 14; i ++)
 {
  if(l[i] == 2) f = i;
  if(l[i] == 1) d[sum ++] = i;
 }
 if(f)
  return ((f * 14 + d[2]) * 14 + d[1]) * 14 + d[0];
 return 0;
}

void compare()
{
 s_sort(b); s_sort(w);
 t_b = 9, t_w = 9;
 bw = 0, ww = 0, tie = 0;
 bw = str_flush(b), ww = str_flush(w);
 if(bw) t_b = 0;
 if(ww) t_w = 0;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = four_kind(b), ww = four_kind(w);
 if(bw) t_b = 1;
 if(ww) t_w = 1;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = full_house(b), ww = full_house(w);
 if(bw) t_b = 2;
 if(ww) t_w = 2;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = one_flush(b), ww = one_flush(w);
 if(bw) t_b = 3;
 if(ww) t_w = 3;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = straight(b), ww = straight(w);
 if(bw) t_b = 4;
 if(ww) t_w = 4;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = tp_kind(b), ww = tp_kind(w);
 if(bw) t_b = 5;
 if(ww) t_w = 5;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = db_db(b), ww = db_db(w);
 if(bw) t_b = 6;
 if(ww) t_w = 6;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = db_kind(b), ww = db_kind(w);
 if(bw) t_b = 7;
 if(ww) t_w = 7;
 if(bw && !ww || ww && !bw)
  return;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }

 bw = 0, ww = 0, tie = 0;
 bw = high(b), ww = high(w);
 if(bw) t_b = 8;
 if(ww) t_w = 8;
 if(bw && ww)
 {
  if(bw > ww)
  {
   ww = 0; return;
  }
  else if(ww > bw)
  {
   bw = 0; return;
  }
  else
  {
   bw = 0, ww = 0, tie = 1; return;
  }
 }
}


int main()
{
 //freopen("in.txt", "r", stdin);
 string str;
 while(cin >> str)
 {
  atoc(str, b[0]);
  int i;
  for(i = 0; i < 4; i ++)
  {
   cin >> str;
   atoc(str, b[i + 1]);
  }
  for(i = 0; i < 5; i ++)
  {
   cin >> str;
   atoc(str, w[i]);
  }
  compare();
  //print();
  if(bw)
   printf("Black wins.\n");
  if(ww)
   printf("White wins.\n");
  if(tie)
   printf("Tie.\n");
 }
 return 0;
}

阅读(4891) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册