hdu1404 sg

来源:互联网 发布:交易猫软件下载 编辑:程序博客网 时间:2024/05/06 21:27

题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1404

题意:给你一个最多6位的字符串你可以:① 把其中一个不为0的数字,变成比它小的数字②删除一个0及它右边的所有字符

代码:

#include <bits/stdc++.h>using namespace std;int  sg[1000005];void init(){  memset(sg, 0, sizeof(sg));  sg[0] = 1;  for (int i = 1; i < 1000000; i++)  {    if (sg[i] == 1) continue;    // 如果i是必败点    int len = (int)log10(i) + 1;    // 把i的每一位变大,然后使其sg值为1    int base = 10;    for (int j = 1; j <= len; j++) {      int pos = (i % base) * 10 / base;  // pos为i的第j位上的数字      for (int k = pos + 1; k <= 9; k++)        sg[(k - pos)*base / 10 + i] = 1;      base *= 10;    }    // 如果i不足6位 , 在其后加以0开头的字符串    if (len < 6) {      sg[i * 10] = 1;      int tmp = i * 100, m = 10;      for (int k = len + 2; k <= 6; k++) {        for (int j = 0; j < m; j++)  sg[tmp + j] = 1;        tmp *= 10, m *= 10;      }    }  }}int main(){  char s[10];  init();  while (scanf("%s", s) != EOF) {    if (s[0] == '0')cout << "Yes" << endl;    else {      if (sg[atoi(s)] == 1) cout << "Yes" << endl;      else cout << "No" << endl;    }  }}
0 0
原创粉丝点击