题意:典型的SG值问题,给n个堆,m个数字,每次只能从一个堆取m个数字之一。
分析:照着做就完事了,但是我不清楚为什么在这题迭代没有递归块?what?
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int k, a[100], f[10001];
int mex(int p)
{
int i, t;
bool g[101] = { 0 };
for (i = 0; i < k; i++)
{
t = p - a[i];
if (t < 0)
break;
if (f[t] == -1)
f[t] = mex(t);
g[f[t]] = 1;
}
for (i = 0;; i++)
{
if (!g[i])
return i;
}
}
int main()
{
int n, i, m, t, s;
while (scanf("%d", &k), k)
{
for (i = 0; i < k; i++)
scanf("%d", &a[i]);
sort(a, a + k);
memset(f, -1, sizeof(f));
f[0] = 0;
scanf("%d", &n);
while (n--)
{
scanf("%d", &m);
s = 0;
while (m--)
{
scanf("%d", &t);
if (f[t] == -1)
f[t] = mex(t);
s = s ^ f[t];
}
if (s == 0)
printf("L");
else
printf("W");
}
printf("\n");
}
}
迭代竟然TL,不懂,是数据问题吗
#include<iostream>
#include<string.h>
#include<sstream>
#include<set>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<math.h>
using namespace std;
const int N = 100+5;
int f[N];
int M[N];
int hashz[N];
int k, m, l;
int SG[N];
int getf(int n) {
for (int i = 1; i <= n; i++) {
memset(hashz, 0, sizeof(hashz));
for (int j = 1; f[j] <= i; j++) {
hashz[SG[i - f[j]]] = 1;
}
for (int j = 0; j <= n; j++) {
if (hashz[j] == 0) {
SG[i] = j;
break;
}
}
}
return SG[n];
}
int main() {
char ans[N];
while (cin >> k && k) {
for (int i = 1; i <= k; i++)cin >> f[i];
f[k + 1] = 100000000;
cin >> m;
for (int i = 0; i < m; i++) {
cin >> l;
int sum = 0;
memset(SG, 0, sizeof(SG));
for (int j = 0; j < l; j++) {
cin >> M[j];
sum =sum^ getf(M[j]);
}
if (sum == 0)
cout << "L";
//ans[i] = 'L';
else
cout << "W";
//ans[i] = 'W';
}
//for (int i = 0; i < m; i++)cout << ans[i];
cout << endl;
}
}