AOJ 1084 K Cards
問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1084。
日本語
解法
全探索で解けます。計算量はどれくらいなのかな。どうやって表記するのかよくわからない。 単純にループのとこだけでやるとO(n(n-1)/2(n-k))とか?こんな複雑な書き方ないよね。 O(n3)には収まります。nが100なので大きくてもn6*だよね。
コード
int main(){ int n, k; while(scanf("%d%d", &n, &k) && n+k){ int c[128]; rep(i, n) scanf("%d", c+i); int ck = 1; rep(i, k) ck *= c[i]; int t = ck; rep(i, n-k){ ck /= c[i]; ck *= c[i+k]; t = max(t, ck); } int res = 0; rep(i, n) REP(j, i+1, n){ swap(c[i], c[j]); int ck = 1; rep(l, k) ck *= c[l]; res = max(res, ck); rep(l, n-k){ ck /= c[l]; ck *= c[l+k]; res = max(res, ck); } swap(c[i], c[j]); } if(res < t) puts("NO GAME"); else printf("%d\n", res-t); } return 0; }
もっときれいにかける気がする。アホですね、これは。やり直し。
int a[128], n, k; int Ck(){ int res, t = 1; rep(i, k) t *= c[i]; res = t; rep(i, n-k){ t /= c[i]; t *= c[i+k]; res = max(res, t); } return res; } int main(){ while(scanf("%d%d", &n, &k) && n+k){ rep(i, n) scanf("%d", c+i); t = Ck(); int res = 0; rep(i, n) REP(j, i+1, n){ swap(c[i], c[j]); res = max(res, Ck()); swap(c[i], c[j]); } if(res < t) puts("NO GAME"); else printf("%d\n", res-t); } return 0; }
だいぶ良くなった?