Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
如果你 T(n * m) 却 TLE……Data sets 组数不确定,注意常数大小。 排名前几 200ms+ 过题实在是太恐怖了,我自认为 T(n * m) 的写法居然都跑了 2300ms+ ……本质上是对于每种硬币,按该硬币面值的个个余数来做处理,这样就能保证每种硬币的处理控制在 T(m)。 代码: // #undef LOCAL // #undef LOCAL_IO #include <cassert> #include <cctype> #include <cfloat> #include <climits> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <bitset> #include <deque> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <algorithm> #include <complex> #include <functional> #include <initializer_list> #include <iterator> #include <limits> #include <new> #include <string> #include <utility> #include <iostream> #include <iomanip> typedef long long i64; using namespace std; #ifdef LOCAL # define debug(x) cout << #x << " = " << x << endl # define debugv(v) cout << #v << ": ["; for (auto iter = v.begin();\ iter != v.end(); ) { cout << *iter << (++iter == v.end() ? "" : ", "); }\ cout << ']' << endl # define debugstmt(s) {s} #else # define debug(...) # define debugv(...) # define debugstmt(...) #endif const int MAXM = 100000; const int MAXN = 100; const int INF = 1e8; bool dp[MAXM + 5]; int a[MAXN + 5], c[MAXN + 5]; void solve(const int n, const int m) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); for (int i = 0; i < n; i++) scanf("%d", &c[i]); memset(dp, 0, sizeof(dp)); dp[0] = true; for (int i = 0; i < n; i++) { if (a[i] > m) continue; for (int j = 0; j < a[i] && j + a[i] <= m; j++) { int maxPrev = -INF; for (int k = j; k <= m; k += a[i]) { if (!dp[k]) { dp[k] = (maxPrev >= k - c[i] * a[i]); } else { maxPrev = k; } } } } int ans = 0; for (int i = 1; i <= m; i++) ans += dp[i]; printf("%d\n", ans); } void solve() { while (true) { int n, m; scanf("%d%d", &n, &m); if (n == 0 && m == 0) break; solve(n, m); } } int main() { #ifdef LOCAL_IO freopen("t.in", "r", stdin); freopen("t.out", "w", stdout); #endif int _ = 1; // scanf("%d", &_); while (_--) { solve(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator